`
三个诸葛亮
  • 浏览: 17609 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自动化运维 Ansible 2.2.1 playbook api

阅读更多
最近把Ansible升级到2.2.1,感觉变化比较大,花些时间对playbook api 的调用做下总结

重大更新:
  • ansible.conf中添加了strategy:free属性, 配置该属性可以实现任务的异步执行,再也不用的等待所有机器执行完,才进入下个任务了。
  • ansible api 和 ansible-playbook api 的调用方式


发现的问题:
  • 2.2.1 的执行速度比1.9略慢


Ansible Playbook api的调用

核心类
ansible.executor.task_queue_manager
  • 将各类参数放到"ansible.executor.task_queue_manager"类中
  • 将playbook 拆分成多个task 放入ansible.executor.task_queue_manager中


直接上源码
class TaskQueueManager:

    '''
    This class handles the multiprocessing requirements of Ansible by
    creating a pool of worker forks, a result handler fork, and a
    manager object with shared datastructures/queues for coordinating
    work between all processes.

    The queue manager is responsible for loading the play strategy plugin,
    which dispatches the Play's tasks to hosts.
    '''

    def __init__(self, inventory, variable_manager, loader, options, passwords, stdout_callback=None, run_additional_callbacks=True, run_tree=False):

        self._inventory        = inventory
        self._variable_manager = variable_manager
        self._loader           = loader
        self._options          = options
        self._stats            = AggregateStats()
        self.passwords         = passwords
        self._stdout_callback  = stdout_callback
        self._run_additional_callbacks = run_additional_callbacks
        self._run_tree         = run_tree

        self._callbacks_loaded = False
        self._callback_plugins = []
        self._start_at_done    = False

        # make sure the module path (if specified) is parsed and
        # added to the module_loader object
        
        ...



参数:
  • inventory --> 由ansible.inventory模块创建,用于导入inventory文件 (也可以直接使用实例)
  • variable_manager --> 由ansible.vars模块创建,用于存储各类变量信息
  • loader --> 由ansible.parsing.dataloader模块创建,用于数据解析
  • options --> 存放各类配置信息的数据字典
  • passwords --> 登录密码,可设置加密信息
  • stdout_callback --> 回调函数(可以自定义返回结果)



完整的例子:
class MyInventory(object):
    """
    this is my ansible inventory object
    """

    def __init__(self, loader, variable_manager, host_list, groupname='default_group'):
        """
        :param loader:
        :param variable_manager:
        :param host_list: ex.:[{'hostname':'','ip':'','port':,'username':,'password':,'become_root_passwd':,'become':,}]
        :param groupname:
        """

        self.inventory = Inventory(loader, variable_manager, host_list=[])
        # self.inventory.refresh_inventory()
        self.set_inventory(host_list, groupname)

    def get_inventory(self):
        return self.inventory

    def set_inventory(self, hosts, groupname, groupvars=None):
        """
        add hosts to a group
        """
        my_group = Group(name=groupname)

        # if group variables exists, add them to group
        if groupvars:
            for key, value in groupvars.iteritems():
                my_group.set_variable(key, value)

        # add hosts to group
        for host in hosts:
            # set connection variables
            hostname = host.get("hostname")
            hostip = host.get('ip', hostname)
            hostport = host.get("port")
            username = host.get("username")
            password = host.get("password")
            become_root_passwd = host.get("become_root_passwd")
            become = host.get("become", True)

            my_host = Host(name=hostname, port=hostport)
            my_host.set_variable('ansible_host', hostip)
            my_host.set_variable('ansible_port', hostport)
            my_host.set_variable('ansible_user', username)
            my_host.set_variable('ansible_ssh_pass', password)
            my_host.set_variable('ansible_become', become)
            my_host.set_variable('ansible_become_method', 'su')
            my_host.set_variable('ansible_become_user', 'root')
            my_host.set_variable('ansible_become_pass', become_root_passwd)

            for key, value in host.iteritems():
                if key not in ["hostname", "port", "username", "password"]:
                    my_host.set_variable(key, value)
            # add to group
            my_group.add_host(my_host)
        self.inventory.add_group(my_group)



class ResultsCallBack(CallbackBase):
    def __init__(self, *args, **kwargs):
        super(ResultsCallBack, 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


class AnsiblePlaybookTask(object):
    def __init__(self, host_list, **kwargs):
        """

        :param host_list: [{'hostname':'','ip':'','port':,'username':,'password':,'become_root_passwd':,'become':,}]
        """
        Options = namedtuple('Options',
                             ['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check',
                              'listtags', 'listtasks', 'listhosts', 'syntax', 'stdout_callback'])
        # initialize needed objects
        self.loader = DataLoader()
        self.variable_manager = VariableManager()
        self.resultCallBack = ResultsCallBack()
        self.options = Options(
            listtags=None,
            listtasks=None,
            listhosts=None,
            syntax=None,
            connection='smart',
            module_path=None,
            forks=100 if not kwargs else kwargs.get('forks', 100),
            become=True, become_method=None,
            stdout_callback=self.resultCallBack,
            become_user=None, check=False)
        myInventory = MyInventory(self.loader, self.variable_manager, host_list)
        self.inventory = myInventory.get_inventory()

    def run_yaml(self, yml_path, extra_vars):
        self.variable_manager.extra_vars = extra_vars
        playbook = Playbook.load(yml_path, variable_manager=self.variable_manager, loader=self.loader)
        p = playbook.get_plays()[0]
        tqm = None
        try:
            tqm = TaskQueueManager(
                inventory=self.inventory,
                variable_manager=self.variable_manager,
                loader=self.loader,
                options=self.options,
                passwords=None,
                stdout_callback=self.options.stdout_callback,
            )
            result = tqm.run(playbook.get_plays()[0])
        finally:
            if tqm is not None:
                tqm.cleanup()
        return result

    def get_result(self):
        self.results_raw = {'ok': {}, 'failed': {}, 'unreachable': {}}
        for host, result in self.resultCallBack.host_ok.items():
            self.results_raw['ok'][host] = result._result

        for host, result in self.resultCallBack.host_failed.items():
            self.results_raw['failed'][host] = result._result

        for host, result in self.resultCallBack.host_unreachable.items():
            self.results_raw['unreachable'][host] = result._result

        return self.results_raw


调用:
playbook = AnsiblePlaybookTask(        [dict(hostname='XXX', ip='XXX', port=XXX, username="XXX",
              password='XXX', become_root_passwd='XXX', become=XXX,
              platform='XXX')         ])
playbook.run_yaml(yml_path='XXX', extra_vars={})

playbook.get_result()



优化点:
  • 可以在MyInventory中设置每个Host的自身属性,并在yml里调用
  • 自定义callback,将结果按需要输出
分享到:
评论

相关推荐

    自动化运维工具Ansible详细部署_自动化运维管理

    文件中的内容似乎没有完全提供,但根据标题和描述,我们可以推断这篇文档将详细阐述自动化运维工具Ansible的部署和管理。Ansible是一款强大的自动化工具,尤其在IT基础设施的配置管理、应用程序部署以及任务自动化等...

    自动化运维工具ansible学习笔记

    自动化运维工具Ansible学习笔记 Ansible是一个简单的自动化运维管理工具,可以用来自动化部署应用、配置、编排task(持续交付、无宕机更新等)。Ansible基于Pythonparamiko开发,分布式,无需客户端,轻量级,配置...

    Linux自动化运维ansible概述与常用模块

    Linux自动化运维ansible概述与常用模块 Linux自动化运维是当前IT行业中非常热门的技术方向,Ansible是自动化运维工具之一,下面我们将对Ansible的概述和常用模块进行详细介绍。 1. 自动化运维的概念 自动化运维是...

    ansible自动化运维

    ansible自动化运维ansible自动化运维ansible自动化运维ansible自动化运维

    运维自动化之ANSIBLE.md

    - 运维自动化发展历程及技术应用 - Ansible命令使用 - Ansible常用模块详解 - YAML语法简介 - Ansible playbook基础 - Playbook变量、tags、handlers使用 - Playbook模板templates - Playbook条件判断 when - ...

    运维自动化之ANSIBLE.pdf

    Ansible 是一种强大的运维自动化工具,它以简洁的 YAML 语法和无代理(agentless)的特性在IT领域中广受欢迎。本章内容主要涵盖了运维自动化的发展历程和技术应用,特别是如何使用 Ansible 来实现自动化。 运维自动...

    Ansible自动化运维实践

    Ansible自动化运维实践是指使用Ansible工具实现自动化运维的实践,Ansible是一款开源的自动化运维工具,旨在简化IT自动化任务。Ansible源自Red Hat,由一系列简单的YAML格式的配置文件组成。 Ansible的核心概念是...

    openssh升级ansible-playbook

    当我们谈论"openssh升级ansible-playbook"时,意味着我们需要使用Ansible的Playbook来自动化OpenSSH的更新过程。 首先,让我们详细了解一下Ansible Playbook。Playbook是Ansible的核心概念,它是以YAML格式编写的...

    自动化运维工具ansible使用教程.zip_python自动化运维pdf

    自动化运维工具ansible使用教程.zip

    ⾃动化运维ansible的⽤法

    自动化运维Ansible的使用 Ansible是一个自动化运维工具,主要用于配置和管理IT infrastructure。Ansible的核心程序是Host Lnventory,它记录了每一个由Ansible管理的主机信息,包括ssh端口、root账号密码、ip地址...

    运维自动化Ansible+playbook 安装配置使用及常用命令整理

    纯个人整理关于ansible方面的部署 及常用命令使用。包括playbook命令使用指导和参数含义。网上很全,但是这里整理的是最经常用到的。绝对实用。而且新手一看就会用。中级以上也会更熟悉

    自动化运维工具 Ansible 详细部署

    ### 自动化运维工具 Ansible 详细部署 #### 基础介绍 ##### 简介 Ansible 是一款先进的自动化运维工具,采用 Python 编程语言开发而成。相较于其他传统工具如 Puppet、Chef 和 CFEngine 等,它具备更为便捷的操作...

    运维自动化之ANSIBLE_ansible运维_

    **运维自动化之ANSIBLE——基于Python的高效运维框架** Ansible是一款开源的自动化工具,尤其在运维领域广泛应用,因其简洁的配置方式、无代理的部署模式以及强大的功能而备受青睐。它采用YAML语言(也称为Ansible ...

    ansible自动化运维实践

    Ansible的另一个亮点是其基于YAML的 playbook,这是一种声明式语言,用于定义自动化任务和工作流,让运维工作变得简洁明了。 在“高维学院-运维开发工程师-Ansible基础-1.pdf”中,你将了解到Ansible的安装过程,...

    Ansible自动化运维技术与最佳实践

    《Ansible自动化运维技术与最佳实践.pdf》2016年5月份出版

    顶级自动化运维工具Ansible教材与笔记

    Ansible是一款广受欢迎的自动化运维工具,它以其简洁的配置语法和无代理的特性,在IT行业中赢得了极高赞誉。本教材与笔记将深入探讨Ansible在自动化运维中的应用,帮助读者理解并掌握其核心概念和实践技巧。 首先,...

    自动化运维工具ansible学习笔记.pdf

    ### Ansible自动化运维工具详解与实践 #### 一、Ansible简介 Ansible是一款非常流行的自动化运维工具,它主要用于简化日常运维工作中的重复性任务,提高运维效率。Ansible使用Python语言开发,其最大的特点之一...

    自动化运维工具Ansible文档与笔记.zip

    6. Ansible Playbook基本使用 7. Ansible Playbook的结构及handler用法 8. Ansible变量之自定义变量 9. Ansible变量之fact 10. Ansible魔法变量及变量优先级 11. 使用lookup生成变量 12. Ansible Vault配置加密 13. ...

Global site tag (gtag.js) - Google Analytics