Example #1
0
    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()
Example #2
0
    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)
Example #3
0
 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)
Example #4
0
    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
Example #5
0
 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()
Example #6
0
 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'])
Example #7
0
 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)
Example #8
0
 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)
Example #9
0
 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)
Example #10
0
 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)
Example #11
0
    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)
Example #12
0
 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)
Example #13
0
    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()
Example #14
0
    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)
Example #15
0
 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)
Example #16
0
    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)
Example #17
0
    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()