コード例 #1
0
    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)
コード例 #2
0
ファイル: playbook.py プロジェクト: zishuang951/lykops
    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'
コード例 #3
0
ファイル: adhoc.py プロジェクト: zishuang951/lykops
    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'
コード例 #4
0
ファイル: read.py プロジェクト: acmchen/Opsystem
    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,
        }
コード例 #5
0
ファイル: write.py プロジェクト: acmchen/Opsystem
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
コード例 #6
0
ファイル: __init__.py プロジェクト: zishuang951/lykops
    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)