def __init__(self, work_uuid, work_name, oper, exec_mode, options, inventory_content, describe, yaml_content='', log_router=None, module_name=None, module_args=None, pattern=None , display=None, mongoclient=None): ''' 实现回调信息写入MongoDB等后端,进行持久化 :parm work_name:工作名称 oper:操作者 op_mode:操作类型,adhoc、playbook等 prov_parm:用户提供的参数,对机密数据进行简单处理 handled_para:用户提供的参数处理后的数据 yamlfile:yaml文件,仅局限于playbook log_router:写入日志路由 yamldata:yaml文件数据 ''' if not log_router: self.log_router = Routing_Logging(mongoclient=mongoclient) else : self.log_router = log_router self.work_uuid = work_uuid self.work_name = work_name self.exec_mode = exec_mode self.oper = oper self.yaml_content = yaml_content self.pattern = pattern self.module_name = module_name self.module_args = module_args self.options = options self.inventory_content = inventory_content self.result = { 'mode' : self.exec_mode, 'name' : self.work_name, 'uuid' : self.work_uuid, 'describe' : describe, 'create_date' : timestamp2datetime(stamp=time.time() , fmt='%Y-%m-%d'), 'create_time' : timestamp2datetime(stamp=time.time() , fmt='%Y-%m-%d %H:%M'), 'options':self.options, 'inventory_content': self.inventory_content, 'create_ts': round(time.time(), 3), } if self.exec_mode == 'adhoc' : self.result['pattern'] = self.pattern self.result['module_name'] = self.module_name self.result['module_args'] = self.module_args if self.exec_mode == 'playbook' : self.result['yaml_content'] = self.yaml_content self.log_dict = { 'level':'info', 'dest' : 'mongo', 'mongo' : self.oper + '.ansible.callback', } super(Write_Storage, self).__init__(display)
def _loading_callback(self, yamlfile): if not self.log_router: self.log_router = Routing_Logging() read2file_api = Read_File(self.username, vault_passwd=self.vault_passwd, mongoclient=self.mongoclient) result = read2file_api.main(yamlfile, preserve=False, together=True) if result[0] : yaml_content = result[1] else : yaml_content = {} self.callback = Write_Storage( self.work_uuid, self.work_name, self.username, self.exec_mode, self._show_protectfield(), self.inventory_content, self.describe, yaml_content=yaml_content, log_router=self.log_router, ) if self.callback: self.logger.info(self.log_prefix + '使用程序自己编写的callback函数') pass elif self.options.one_line: self.callback = 'oneline' else: self.callback = 'minimal'
def _loading_callback(self): if not self.log_router: self.log_router = Routing_Logging() self.callback = Write_Storage(self.work_uuid, self.work_name, self.username, self.exec_mode, self._show_protectfield(), self.inventory_content, self.describe, module_name=self.options.module_name, module_args=self.options.module_args, log_router=self.log_router, pattern=self.pattern, mongoclient=self.mongoclient) if self.callback: self.logger.info(self.log_prefix + '使用程序自己编写的callback函数') pass elif self.options.one_line: self.callback = 'oneline' else: self.callback = 'minimal'
def __init__(self, oper, log_router=False, mongoclient=None): ''' 根据condition_dict读取所有的callback日志 :parm condition_dict:查询条件 ''' self.logger = logging.getLogger("ansible") if mongoclient is None: self.mongoclient = Op_Mongo() else: self.mongoclient = mongoclient if not log_router: from library.storage.logging import Routing_Logging log_router = Routing_Logging() self.log_router = log_router self.collect = oper + '.ansible.callback' self.log_dict = { 'level': 'info', 'dest': 'mongo', 'mongo': self.collect, }
class Write_Storage(CallbackBase): ''' 实现回调信息写入MongoDB等后端,进行持久化 ''' CALLBACK_VERSION = 2.0 CALLBACK_TYPE = 'stdout' CALLBACK_NAME = 'storage' def __init__(self, work_uuid, work_name, oper, exec_mode, options, inventory_content, describe, yaml_content='', log_router=None, module_name=None, module_args=None, pattern=None, display=None, mongoclient=None): ''' 实现回调信息写入MongoDB等后端,进行持久化 :parm work_name:工作名称 oper:操作者 op_mode:操作类型,adhoc、playbook等 prov_parm:用户提供的参数,对机密数据进行简单处理 handled_para:用户提供的参数处理后的数据 yamlfile:yaml文件,仅局限于playbook log_router:写入日志路由 yamldata:yaml文件数据 ''' if not log_router: self.log_router = Routing_Logging(mongoclient=mongoclient) else: self.log_router = log_router host_name = '' if isinstance(inventory_content, list): host_name = inventory_content[1] inventory_content = inventory_content[0] self.work_uuid = work_uuid self.work_name = work_name self.exec_mode = exec_mode self.oper = oper self.yaml_content = yaml_content self.pattern = pattern self.module_name = module_name self.module_args = module_args self.options = options self.inventory_content = inventory_content self.result = { 'mode': self.exec_mode, 'name': self.work_name, 'uuid': self.work_uuid, 'describe': describe, 'create_date': timestamp2datetime(stamp=time.time(), fmt='%Y-%m-%d'), 'create_time': timestamp2datetime(stamp=time.time(), fmt='%Y-%m-%d %H:%M'), 'options': self.options, 'inventory_content': self.inventory_content, 'create_ts': round(time.time(), 3), } if self.exec_mode == 'adhoc': self.result['pattern'] = self.pattern self.result['module_name'] = self.module_name self.result['module_args'] = self.module_args if self.exec_mode == 'playbook': self.result['yaml_content'] = self.yaml_content if host_name == '': self.log_dict = { 'level': 'info', 'dest': 'mongo', 'mongo': self.oper + '.ansible.callback', } else: self.log_dict = { 'level': 'info', 'dest': 'mongo', 'mongo': 'user.' + self.oper + '.inventory', 'hostname': host_name } super(Write_Storage, self).__init__(display) def v2_playbook_on_play_start(self, play): self.result['play'] = { 'name': play.name, 'id': str(play._uuid), } self.result['play_id'] = str(play._uuid) self.log_router.write(self.result, self.oper, log_dict=self.log_dict) def v2_playbook_on_task_start(self, task, is_conditional): if self.exec_mode == 'adhoc': # taskname = self.work_name taskname = str(task) elif self.exec_mode == 'playbook': taskname = task.name args_dict = task.args self.result['task'] = { 'name': taskname, 'module': task.action, 'args': args_dict, # 请看ansible/lib/ansible/plugins/strategy/linear.py 'id': str(task._uuid), 'start_ts': round(time.time(), 3), } self.result['task_id'] = str(task._uuid) self.result['detail'] = {} self.log_router.write(self.result, self.oper, log_dict=self.log_dict) def v2_runner_on_ok(self, result, **kwargs): host = result._host hstnm = host.get_name() self.result['detail'][hstnm] = result._result self.result['detail'][hstnm]['start_ts'] = self.result['task'][ 'start_ts'] self.result['detail'][hstnm]['end_ts'] = round(time.time(), 3) self.result['finish_ts'] = round(time.time(), 3) self.log_router.write(self.result, self.oper, log_dict=self.log_dict) def v2_playbook_on_no_hosts_matched(self): self.result['finish_ts'] = round(time.time(), 3) self.result['stats'] = '没有匹配的主机' self.log_router.write(self.result, self.oper, log_dict=self.log_dict) def v2_playbook_on_stats(self, stats): hosts = sorted(stats.processed.keys()) summary = {} for h in hosts: s = stats.summarize(h) summary[h] = s self.result['summary'] = summary self.result['finish_ts'] = round(time.time(), 3) self.log_router.write(self.result, self.oper, log_dict=self.log_dict) v2_runner_on_failed = v2_runner_on_ok v2_runner_on_unreachable = v2_runner_on_ok v2_runner_on_skipped = v2_runner_on_ok
def __init__(self, exec_mode, work_name, username, options_dict, describe, mongoclient=None): ''' ansible的基类,为adhoc、playbook等父类 :parm: exec_mode:ansible工作类型,接受adhoc、palybook等 work_name:该任务的名称,用于日志 username:执行者 options_dict:该任务的特定设置 mongoclient:初始化mongo连接类 ''' self.logger = logging.getLogger("ansible") if exec_mode in ('adhoc', 'playbook'): self.exec_mode = exec_mode else: self.logger.warn( '正在准备执行ansible任务,准备工作失败,原因:参数exec_mode必须是adhoc或者是playbook') return (False, '参数exec_mode必须是adhoc或者是playbook') if isinstance(work_name, str) and work_name: self.work_name = work_name else: self.logger.warn('正在准备执行ansible任务,准备工作失败,原因:参数work_name必须是非字符串') return (False, '参数work_name必须是非字符串') if isinstance(username, str) and username: self.username = username else: self.logger.warn('正在准备执行ansible任务,准备工作失败,原因:参数username必须是非字符串') return (False, '参数username必须是非字符串') if isinstance(options_dict, dict) and options_dict: self.options_dict = options_dict else: self.logger.warn('正在准备执行ansible任务,准备工作失败,原因:参数options_dict必须是非空字典') return (False, '参数options_dict必须是非空字典') if mongoclient is None: self.mongoclient = Op_Mongo() else: self.mongoclient = mongoclient self.work_uuid = str(uuid.uuid4()) self.log_router = Routing_Logging() self.describe = describe if exec_mode == 'adhoc': self.log_prefix = '正在执行用户' + username + '的名为' + work_name + 'uuid为' + self.work_uuid + '的ansible临时任务,' else: self.log_prefix = '正在执行用户' + username + '的名为' + work_name + 'uuid为' + self.work_uuid + '的ansible-playbook任务,' # 下面是加载和初始化相关类 self._parse_options() self.passwords = { 'conn_pass': self.options.ask_pass, 'become_pass': self.options.become_ask_pass } # 设置passwords self.inventory_file = self.options_dict.get('inventory', '') self.loader = DataLoader() self._get_vault_pwd() self.variable_manager = VariableManager() self.variable_manager.extra_vars = load_extra_vars( loader=self.loader, options=self.options) self.variable_manager.options_vars = load_options_vars(self.options) self.inventory = Inventory(loader=self.loader, variable_manager=self.variable_manager, host_list=self.inventory_file) self.variable_manager.set_inventory(self.inventory) self.inventory.subset(self.options.subset)