def provision(self): try: # 更新任务状态 try: yield self.update_task_handler() except Exception as err: raise err # 获取自动装机服务 try: provision_service = yield self.get_provision_service() except Exception as err: gen_log.error('Get Provision Service Error From Zookeeper:%s' % err.args) raise Exception('Get Provision Service Error From Zookeeper') provision_url = provision_service + '/provision/v1/server' result = self.return_json(3, 'Unknown Status') if eq(self.action, 'add'): # 新装服务器 try: response = yield http_client(provision_url, 'POST', self.cookie, self.task_args, 15) except HTTPError as err: gen_log.error(err.message) raise err else: result = json_decode(response.body) elif eq(self.action, 'reinstall'): # 重装服务器 try: response = yield http_client(provision_url, 'PUT', self.cookie, self.task_args, 15) except HTTPError as err: gen_log.error(err.message) raise err else: result = json_decode(response.body) self.result = result if result['status'] == 0: yield self.update_task_wait_check() elif result['status'] == -1: yield self.update_task_fail() except HTTPError as err: self.result = self.return_json(-1, err.message) yield self.update_task_fail() except Exception as err: self.result = self.return_json(-1, err.args) yield self.update_task_fail()
def get_user(self): ansible_service = yield self.get_ansible_service() ansible_url = 'http://%s/ansible/task' % ansible_service self.ansible_json['args'] = self.get_user_cmd self.ansible_json['module'] = 'shell' try: response = yield http_client(ansible_url, 'POST', self.cookie, self.ansible_json, 600) except HTTPError as err: raise err else: result = json_decode(response.body) for key in result['msg'].keys(): host = result['msg'][key] if host['status'] == 0: user_list = list() for user in host['msg']: print(user) uid = int(user.split(':')[2]) user_name = user.split(':')[0] login = user.split(':')[-1] if uid >= 1000 and 'nologin' not in login: print(user_name) user_list.append(user_name) host['msg'] = user_list raise Return(result)
def check_package_installed(self): try: ansible_service = yield self.get_ansible_service() ansible_url = 'http://%s/ansible/task' % ansible_service self.ansible_json[ 'args'] = self.GET_SOURCE_LIST_CMD + self.package_name self.ansible_json['module'] = 'shell' response = yield http_client(ansible_url, 'POST', self.cookie, self.ansible_json, 600) except HTTPError as error: gen_log.info(error) raise error else: result = json_decode(response.body) for key in result['msg'].keys(): host = result['msg'][key] if host['status'] == 0: if self.package_name in host['msg'][0]: package_info = dict() package = host['msg'][0] package_info['name'] = package.split()[0] package_info['version'] = package.split()[1] host['msg'] = package_info else: host['status'] = 1 raise Return(result)
def update_dhcp_config(self): file_path = os.path.join(os.path.dirname(__file__), "../templates/dhcpd.conf.template") template_file = open(file_path) try: template_buffer = template_file.read() except FileNotFoundError as err: raise err finally: template_file.close() template = Template(template_buffer) try: dhcp_list = yield self.get_dhcp_servers() pxe_template_list = yield self.get_pxe_templates() except HTTPError as err: raise err dhcp_tempalte = template.render(dhcp_servers=dhcp_list, pxe_template_list=pxe_template_list) dhcp_host = dhcp_list[0]['dhcp_server_ip'] dhcp_dest = dhcp_list[0]['dhcp_config_path'] try: url = self.ansible_url + '/ansible/task' dhcp_template_ansible_json = { 'module': 'copy', 'file_name': 'dhcpd.conf', 'host': dhcp_host, 'content': dhcp_tempalte, 'dest': dhcp_dest } restart_dhcp_service_json = { 'module': 'systemd', 'name': 'dhcpd', 'state': 'restarted', 'host': dhcp_host } yield http_client(url, 'POST', self.cookie, dhcp_template_ansible_json, 60) yield http_client(url, 'POST', self.cookie, restart_dhcp_service_json, 60) except HTTPError as err: raise err
def update_server(self): update_json = { 'manager_ip': self.task_args['manager_ip'], 'status': '运行正常', } url = self.async_api_url + '/api/async/v1/servers' try: yield http_client(url, 'PATCH', self.cookie, update_json) except HTTPError as err: self.result = self.return_json(-1, err.message) yield self.update_task_fail()
def get_dhcp_servers(self): url = '%s/api/async/v1/dhcp/servers' % self.async_api_url try: response = yield http_client(url, 'GET', self.cookie) except HTTPError as error: gen_log.error('Get DHCP Template Error:%s' % error) raise error else: result = json_decode(response.body) gen_log.info(result) raise Return(result['msg'])
def get_mac_list(self): try: provision_service = yield self.get_provision_service() provision_url = 'http://%s/provision/v1/hardware/mac_addr/%s' % (provision_service, self.manager_ip) response = yield http_client(provision_url, 'GET', self.cookie, None, 120) except HTTPError as err: gen_log.info(err) raise err else: result = response.body raise Return(result)
def get_hostname(self): try: ansible_service = yield self.get_ansible_service() ansible_url = 'http://%s/ansible/task' % ansible_service self.ansible_json['args'] = self.get_hostname_cmd self.ansible_json['module'] = 'shell' response = yield http_client(ansible_url, 'POST', self.cookie, self.ansible_json, 600) except HTTPError as err: gen_log.info(err) raise err else: raise Return(response.body)
def get_tasks(self, fetch_url, cookie): try: response = yield http_client(fetch_url, 'GET', cookie) except HTTPError as err: raise err else: tasks = json_decode(response.body) # print(tasks) try: yield self.queue.put(tasks) except Exception as e: gen_log.error(e)
def update_task_wait_check(self): post_json = { 'task_status_id': TASK_STATUS_WAIT_CHECK, 'update_time': datetime.strftime(datetime.now(), DATETIME_FMT), 'result': self.result, 'task_name': self.task_name } url = '%s/%s' % (self.async_api_url, TASK_URI) try: response = yield http_client(url, 'PATCH', self.cookie, post_json) except HTTPError as err: gen_log.error('Update Task %s Success Error:%s' % (self.task_name, err.message)) raise Exception('Update Task %s Success Error:%s' % (self.task_name, err.message)) else: result = json_decode(response.body) if result['status'] < 0: gen_log.error('Task : %s ,Update Wait Check:Error:%s' % (self.task_name, result['msg'])) raise Exception('Update Wait Check <%s> error: %s' % (self.task_name, result['msg'])) else: gen_log.info('Task : %s ,Update Wait Check:Done' % self.task_name)
def check_installed_resource(self): try: ansible_service = yield self.get_ansible_service() ansible_url = 'http://%s/ansible/task' % ansible_service self.ansible_json['args'] = self.GET_SOURCE_LIST_CMD self.ansible_json['module'] = 'shell' response = yield http_client(ansible_url, 'POST', self.cookie, self.ansible_json, 600) except HTTPError as error: gen_log.info(error) raise error else: result = json_decode(response.body) for key in result['msg'].keys(): host = result['msg'][key] if host['status'] == 0: source_name = self.source_name + '.repo' if source_name not in host['msg']: host['status'] = 1 raise Return(result)
def get_services(self): try: ansible_service = yield self.get_ansible_service() ansible_url = 'http://%s/ansible/task' % ansible_service self.ansible_json['args'] = self.get_service_cmd self.ansible_json['module'] = 'shell' response = yield http_client(ansible_url, 'POST', self.cookie, self.ansible_json, 600) except HTTPError as err: gen_log.info(err) raise err else: result = json_decode(response.body) for key in result['msg'].keys(): host = result['msg'][key] if host['status'] == 0: services = list() for service in host['msg'][0].split(): services.append(service) host['msg'] = services raise Return(result)
def run_ansible_task(self): gen_log.info('Task %s Start' % self.task_name) try: # 更新任务状态 try: yield self.update_task_handler() except Exception as err: raise err # 获取ansible service ansible_url = '' try: ansible_service = yield self.get_ansible_service() ansible_url = 'http://%s/%s' % (ansible_service, 'ansible/task') except Exception as err: gen_log.error(err.args) raise Exception('Get Ansible Service Error') # 执行ansible任务 try: response = yield http_client(ansible_url, 'POST', None, self.ansible_json, 60) except HTTPError as err: gen_log.error('Run Ansible %s %s Error:%s' % (self.task_name, ansible_url, err.args)) self.result = self.return_json(-1, err.message) yield self.update_task_fail() else: result = json_decode(response.body) self.result = result try: if eq(result['status'], 0): yield self.update_task_success() else: yield self.update_task_fail() except HTTPError as err: raise err except Exception as err: self.result = self.return_json(-1, err.args) yield self.update_task_fail()
def get_installed_resource_list(self): try: ansible_service = yield self.get_ansible_service() ansible_url = 'http://%s/ansible/task' % ansible_service self.ansible_json['args'] = self.GET_SOURCE_LIST_CMD self.ansible_json['module'] = 'shell' response = yield http_client(ansible_url, 'POST', self.cookie, self.ansible_json, 600) except HTTPError as error: gen_log.info(error) raise error else: result = json_decode(response.body) repo_list = list() for key in result['msg'].keys(): host = result['msg'][key] if host['status'] == 0: for source in host['msg']: repo_list.append(source.split('.')[0]) host['msg'] = repo_list raise Return(result)
def update_task_fail(self): post_json = { 'task_status_id': TASK_STATUS_FAILURE_ID, 'update_time': datetime.strftime(datetime.now(), DATETIME_FMT), 'result': self.result, 'task_name': self.task_name, } gen_log.info(post_json) url = '%s/%s' % (self.async_api_url, TASK_URI) try: response = yield http_client(url,'PATCH',self.cookie, post_json) gen_log.error(response.body) except HTTPError as err: gen_log.error('Update Task Fail %s Error:%s' % (self.task_name, err.message)) raise err else: result = json_decode(response.body) print(result) if result['status'] < 0: gen_log.error('Update Task Fail %s Error' % self.task_name) raise Exception('Update Fail <%s> error: %s' % (self.task_name, result['msg'])) else: gen_log.info('Update Task %s Fail: Done' % self.task_name)
def update_task_handler(self): self.result = { 'msg': '任务执行中' } post_json = { 'task_status_id': TASK_STATUS_HANDLER_ID, 'update_time': datetime.strftime(datetime.now(), DATETIME_FMT), 'result': self.result, 'task_name': self.task_name } url = '%s/%s' % (self.async_api_url, TASK_URI) try: response = yield http_client(url, 'PATCH', self.cookie, post_json) except HTTPError as err: gen_log.error('Update Task Handler %s Error:%s' % (self.task_name, err.message)) raise err else: result = json_decode(response.body) if result['status'] < 0: gen_log.error('Update Task %s Handler:%s' % (self.task_name, result['msg'])) raise Exception('Update Handler <%s> error: %s' % (self.task_name, result['msg'])) else: gen_log.info('Update Task %s Handler: Done' % self.task_name)
def check_server_install_result(self): try: # 更新任务状态为检测中 try: yield self.update_task_checking() except Exception as err: raise err # 获取自动装机服务 try: provision_service = yield self.get_provision_service() except Exception as err: gen_log.error('Get Provision Service Error From Zookeeper:%s' % err.args) raise Exception('Get Provision Service Error From Zookeeper') # 检测服务器安装状态 # 每分钟检测一次,检测20次 gen_log.info('每60S检测一次任务-%s-安装结果,总共检测20次' % self.task_name) times = 21 success = False index = 1 provision_url = provision_service + '/provision/v1/server/check?server_ip=%s' % self.task_args[ 'server_ip'] result = self.return_json(3, 'Unknown Status') while True: if index < times: response = yield http_client(provision_url, 'GET', self.cookie) result = json_decode(response.body) if result['status'] == -1: gen_log.info('第%s次检测, 服务器%s检测不成功,未达到次数限制,等待60S' % (index, self.task_name)) yield sleep(60) else: gen_log.info('服务器%s安装完成' % self.task_name) success = True break else: gen_log.info('服务器%s安装失败' % self.task_name) break index += 1 if success: # 更新server信息 yield self.update_server() if self.action == 'reinstall': self.result = self.return_json( 0, '%s reinstall success' % self.task_args['server_name']) elif self.action == 'add': self.result = self.return_json( 0, '%s install success' % self.task_args['server_name']) yield self.update_task_success() else: self.result = self.return_json( -1, '%s install fail' % self.task_args['server_name']) yield self.update_task_fail() except Exception as err: self.result = self.return_json(-1, err.args) yield self.update_task_fail()