美文网首页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还没测试

相关文章

  • ansible 2.4 python api

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

  • Ansible2.0 python Api

    Ansible2.0 python Api Python 3.6.2 ansible 2.4.3.0 官方示例 ...

  • python Ansible API使用

    Ansible版本2.6.4,记录下ansible API使用,合入到运营系统,会使用到ansible批量操作服务...

  • ansible python api使用

    最近小组有个新需求,需要自助添加root权限给用户,第一个想到的可以用ansible来搞,已经用python把接口...

  • Python Ansible API 实战

    Python 调用 Ansible API 实现自动化管理,为后续运维平台自动化管理提供帮助,也是学习Jumpse...

  • ansible官方文档解析

    对ansible2.7中官方文档Python API文档中的例子解析 官方文档地址: https://docs.a...

  • Ansible 开发API 之【使用api运行task任务】

    ansible 依赖于子进程,因此API不是线程安全的。 环境 本文使用的是ansible api 2.0ansi...

  • ansible基础

    一、ansible 1.1、ansible ansible基于Python开发,集合了众多运维工具(puppet、...

  • Ansible2.0 Api接口调用

    Ansible Api 学习文档 Ansible Api接口的文档太少,先来一堆学习的资料 1.如何使用Ansib...

  • Jumpserver

    Python Django mysql ansible

网友评论

  • 2b544aa8d3c0: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