美文网首页Openstack
ansible 2.4 python api

ansible 2.4 python api

作者: 神力无敌_61b6 | 来源:发表于2018-03-05 21:06 被阅读1499次

    ansible升级到v2.4后,之前写的接口就出现了几个小错误,这边更新一下

    # -*- coding:utf-8 -*-
    from collections import namedtuple
    from ansible.parsing.dataloader import DataLoader
    from ansible.vars.manager import VariableManager
    from ansible.inventory.manager import InventoryManager
    from ansible.playbook.play import Play
    from ansible.executor.task_queue_manager import TaskQueueManager
    from tempfile import NamedTemporaryFile
    # from ansible.MyInventory import MyInventory
    from ansible.plugins.callback import CallbackBase
    import os
    
    class MyRunner(object):  
        """ 
        This is a General object for parallel execute modules. 
        """  
        def __init__(self, resource, *args, **kwargs):  
            self.resource = resource  
            self.inventory = None  
            self.variable_manager = None  
            self.loader = None  
            self.options = None  
            self.passwords = None  
            self.callback = None  
            self.__initializeData()  
            self.results_raw = {}  
      
        def __initializeData(self):  
            """ 
            初始化ansible 
            """
           
            Options = namedtuple('Options',
                                 ['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check',
                                  'diff'])
     
    
    
            self.loader = DataLoader()
      
            self.options = Options(connection='ssh', module_path='/path/to/mymodules', forks=100, become=None,
                                   become_method=None, become_user=None, check=False,
                                   diff=False)
         
            self.passwords = dict(vault_pass='secret')
            self.inventory = InventoryManager(loader=self.loader, sources=self.resource)
            self.variable_manager = VariableManager(loader=self.loader, inventory=self.inventory)
          
      
        def run(self, host_list, module_name, module_args,):  
            """ 
            run module from andible ad-hoc. 
            module_name: ansible module_name 
            module_args: ansible module args 
            """  
            # create play with tasks  
            play_source = dict(  
                    name="Ansible Play",  
                    hosts=host_list,  
                    gather_facts='no',  
                    tasks=[dict(action=dict(module=module_name, args=module_args))]  
            )  
            play = Play().load(play_source, variable_manager=self.variable_manager, loader=self.loader)  
      
            # actually run it  
            tqm = None  
            self.callback = ResultsCollector()  
            try:  
                tqm = TaskQueueManager(  
                        inventory=self.inventory,  
                        variable_manager=self.variable_manager,  
                        loader=self.loader,  
                        options=self.options,  
                        passwords=self.passwords,
                        stdout_callback='default', 
                )  
                tqm._stdout_callback = self.callback  
                result = tqm.run(play)  
            #print result
            #print self.callback
            finally:  
                if tqm is not None:  
                    tqm.cleanup()  
      
        def run_playbook(self, host_list, role_name, role_uuid, temp_param):  
            """ 
            run ansible palybook 
            """  
            try:  
                self.callback = ResultsCollector()  
                filenames = [BASE_DIR + '/handlers/ansible/v1_0/sudoers.yml']    #playbook的路径  
                logger.info('ymal file path:%s'% filenames)  
                template_file = TEMPLATE_DIR            #模板文件的路径  
                if not os.path.exists(template_file):  
                    logger.error('%s 路径不存在 '%template_file)  
                    sys.exit()  
      
                extra_vars = {}     #额外的参数 sudoers.yml以及模板中的参数,它对应ansible-playbook test.yml --extra-vars "host='aa' name='cc' "  
                host_list_str = ','.join([item for item in host_list])  
                extra_vars['host_list'] = host_list_str  
                extra_vars['username'] = role_name  
                extra_vars['template_dir'] = template_file  
                extra_vars['command_list'] = temp_param.get('cmdList')  
                extra_vars['role_uuid'] = 'role-%s'%role_uuid  
                self.variable_manager.extra_vars = extra_vars  
                ##logger.info('playbook 额外参数:%s'%self.variable_manager.extra_vars)
                # actually run it  
                executor = PlaybookExecutor(  
                    playbooks=filenames, inventory=self.inventory, variable_manager=self.variable_manager, loader=self.loader,  
                    options=self.options, passwords=self.passwords,  
                )  
                executor._tqm._stdout_callback = self.callback  
                executor.run()  
            except Exception as e:  
                ##logger.error("run_playbook:%s"%e)
                pass
      
        def get_result(self):  
            self.results_raw = {'success':{}, 'failed':{}, 'unreachable':{}}  
            for host, result in self.callback.host_ok.items():  
                self.results_raw['success'][host] = result._result  
      
            for host, result in self.callback.host_failed.items():  
                self.results_raw['failed'][host] = result._result
      
            for host, result in self.callback.host_unreachable.items():  
                self.results_raw['unreachable'][host]= result._result['msg']  
      
            #print "Ansible执行结果集:%s"%self.results_raw
            return self.results_raw
    
    class ResultsCollector(CallbackBase):  
      
        def __init__(self, *args, **kwargs):  
            super(ResultsCollector, self).__init__(*args, **kwargs)  
            self.host_ok = {}  
            self.host_unreachable = {}  
            self.host_failed = {}  
      
        def v2_runner_on_unreachable(self, result):  
            self.host_unreachable[result._host.get_name()] = result  
      
        def v2_runner_on_ok(self, result,  *args, **kwargs):  
            self.host_ok[result._host.get_name()] = result  
      
        def v2_runner_on_failed(self, result,  *args, **kwargs):  
            self.host_failed[result._host.get_name()] = result   
    
    
    

    调用如下:

    from ansible_api import MyRunner
    # 传入inventory路径
    ansible = MyRunner('/etc/ansible/hosts')
    # 获取服务器磁盘信息
    ansible.run('all', 'setup', "filter='ansible_mounts'")
    #结果
    result=ansible.get_result()
    #成功
    succ = result['success']
    #失败
    failed = result['failed']
    #不可到达
    unreachable = result['unreachable']
    
    
    

    run_playbook还没测试

    相关文章

      网友评论

      • veronic_8792:hello,能给个run_playbook的测试吗
      • 叹息无门:Option的connection需要写成:ssh吧,不然总是在本地执行
        神力无敌_61b6:@叹息无门 好嘞
        叹息无门:self.options = Options(connection='local', module_path='/path/to/mymodules', forks=100, become=None,
        become_method=None, become_user=None, check=False,
        diff=False)
        这里的option设定,connection="local"的话,我测试的结果都是仅在本地执行,不会在inventory设定的主机执行
        神力无敌_61b6:你说的是ansible shell模块本地执行吗?

      本文标题:ansible 2.4 python api

      本文链接:https://www.haomeiwen.com/subject/yckkfftx.html