ansible-playbook api 2.0

官方文档见  http://docs.ansible.com/ansible/dev_guide/developing_api.html

拿官方的例子修改如下

import json
from collections import namedtuple
from ansible.parsing.dataloader import DataLoader
from ansible.vars import VariableManager
from ansible.inventory import Inventory
from ansible.playbook.play import Play
from ansible.executor.task_queue_manager import TaskQueueManagerfrom ansible.executor.task_result import TaskResult
from ansible.plugins.callback import CallbackBase

# 自定义 callback,即在运行 api 后调用本类中的 v2_runner_on_ok(),在这里会输出 host 和 result 格式
class ResultCallback(CallbackBase):
    """A sample callback plugin used for performing an action as results come in

    If you want to collect all results into a single object for processing at
    the end of the execution, look into utilizing the ``json`` callback plugin
    or writing your own custom callback plugin
    """
    def v2_runner_on_ok(self, result, **kwargs):
        """Print a json representation of the result

        This method could store the result in an instance attribute for retrieval later
        """
        # result 包含‘_check_key‘, ‘_host‘, ‘_result‘, ‘_task‘, ‘is_changed‘, ‘is_failed‘, ‘is_skipped‘, ‘is_unreachable‘
        host = result._host
        print json.dumps({host.name: result._result}, indent=4)

    """
    def v2_on_any(self, *args, **kwargs):
        if isinstance(args[0], TaskResult):
            print json.dumps({args[0]._host.name: args[0]._result}, indent=4)
    """

Options = namedtuple(‘Options‘, [‘connection‘, ‘module_path‘, ‘forks‘, ‘become‘, ‘become_method‘, ‘become_user‘, ‘check‘])
# initialize needed objects
variable_manager = VariableManager()
loader = DataLoader()
options = Options(connection=‘smart‘, module_path=None, forks=100, become=None, become_method=None, become_user=None, check=False)
passwords = dict(conn_pass=‘mypassword‘)  # 目前只发现有两个key,conn_pass, become_pass

# Instantiate our ResultCallback for handling results as they come in
results_callback = ResultCallback()

# create inventory and pass to var manager
inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list=‘hosts‘)  # hosts文件,也可以是 ip列表
variable_manager.set_inventory(inventory)

# create play with tasks
play_source =  dict(
        name = "Ansible Play",
        hosts = ‘web‘,   # 对应 playbook 入口yaml文件的 hosts变量,也可以是 ip
        gather_facts = ‘no‘,
        tasks = [
            dict(action=dict(module=‘shell‘, args=‘ifconfig‘), register=‘shell_out‘),
            #dict(action=dict(module=‘debug‘, args=dict(msg=‘{{shell_out.stdout}}‘)))
         ]
    )
play = Play().load(play_source, variable_manager=variable_manager, loader=loader)

# actually run it
# TaskQueueManager 是创建进程池,负责输出结果和多进程间数据结构或者队列的共享协作
tqm = None
try:
    tqm = TaskQueueManager(
              inventory=inventory,
              variable_manager=variable_manager,
              loader=loader,
              options=options,
              passwords=passwords,
              stdout_callback=results_callback,  # Use our custom callback instead of the ``default`` callback plugin
              # 如果注释掉 callback 则会调用原生的 DEFAULT_STDOUT_CALLBACK,输出 task result的output,同 ansible-playbook debug
          )
    result = tqm.run(play)
    print result  # 返回码,只要有一个 host 出错就会返回 非0 数字
finally:
    if tqm is not None:
        tqm.cleanup()

如果需要统一输出可以重写

v2_runner_on_failed(self, result, ignore_errors=False)
v2_runner_on_ok(self, result)
v2_runner_on_skipped(self, result)
v2_runner_on_unreachable(self, result)
v2_runner_on_no_hosts(self, task)
具体可以参考 plugins/callback/__init__.py
时间: 2024-08-02 01:39:31

ansible-playbook api 2.0的相关文章

Ansible playbook API 开发 调用测试

Ansible是Agentless的轻量级批量配置管理工具,由于出现的比较晚(13年)基于Ansible进行开发的相关文档较少,因此,这里通过一些小的实验,结合现有资料以及源码,探索一下Ansible的二次开发. 随笔的内容分为三个部分 playbook编辑执行 python 调用API执行playbook java调用python程序进行playbook的执行 实验的环境是centos6,ansible版本是1.9.4,python版本是2.6.6,jdk版本是1.7U79 一.playboo

ansible python api 2.0使用

最近想利用python来调用anbile来实现一些功能,发现ansible的api已经升级到了2.0,使用上比以前复杂了许多. 这里我参考了官方文档的例子,做了一些整改,写了一个python调用ansible的函数,执行过程中输出执行结果.函数返回执行结果,便于筛选和存储所需的数据: # vim exec_ansible.py def exec_ansible(module,args,host):         import json     from collections import n

Ansible AdHoc & playbook API + 动态生成Inventory +结果关注

为以后用的方便,记录一下(主要是怕忘,又得折腾半天) 直接贴代码,没太多注释,看不懂的看下源码.Pycharm+b Ansible 2.0 之后的 API 比 2.0 之前要复杂,但使用起来的自由度更好,可根据自己需求修改 Ansible API 的使用方法:功能也更强大. 我主要是使用这个 API 配合 Djcelery 实现监控系统的数据采集功能,好处是不再需要每中服务器再开发一个agent.这样使用的问题可能主要是程序的负载性能及程序并发性能,我还没测试. -- coding:utf8 -

Ansible API 2.0解析

import json from collections import namedtuple from ansible.parsing.dataloader import DataLoader from ansible.vars import VariableManager from ansible.inventory import Inventory from ansible.playbook.play import Play from ansible.executor.task_queue_

运维自动化之ansible playbook结合docker安装smokeping

本次介绍ansible的paly book结合docker进行虚拟机里安装2.6.8版本smokeping(apache版本是2.4.7). docker版本 09:26:53 # docker version Client version: 0.11.1 Client API version: 1.11 Go version (client): go1.2.1 Git commit (client): fb99f99/0.11.1 Server version: 0.11.1 Server A

Python API 2.0

Python API 2.0从2.0的事情开始更复杂一些,但是你会得到更多离散和可读的类: #!/usr/bin/env python import jsonfrom collections import namedtuplefrom ansible.parsing.dataloader import DataLoaderfrom ansible.vars import VariableManagerfrom ansible.inventory import Inventoryfrom ansi

运维自动化之ansible playbook一键化解决大量主机bash更新问题

今天发现有bash漏洞,但我这里近1000台服务器,为了方便.省时间,觉得使用ansible安装bash更新包,下面分享一下我的安装方法. 1.安装的playbook的内容 19:00:03 # cd /etc/ansible [email protected]:/etc/ansible 19:00:06 # cat update_bash.yml  --- - hosts: "{{ host }}"   remote_user: "{{ user }}"   ga

运维自动化之ansible playbook安装mysql

上次介绍了如何使用ansible playbook安装zabbix客户端(http://dl528888.blog.51cto.com/2382721/1436745),这次介绍一下如何使用playbook安装mysql. 下面是安装mysql的信息: mysql_basedir: /data/mysql/basedir                    源码目录 mysql_datadir: /data/mysql/datadir                    数据目录 mysql

运维自动化之ansible playbook安装ruby环境

本来不想打算写安装ruby的,但看几个puppet的群里有人对安装ruby比较茫然,所以这里简单介绍一下如何安装ruby. ps:话说现在也就gitlab.capistrano.puppet等软件使用ruby,最新2010年的软件好的都是python了,比如ansible.salt等. 下面是安装ruby的信息: ruby_version: 1.9.3 ruby_dir: /usr/local gem_version: 1.8.23 bundle_version: 1.6.3 可以看到ruby的