我的编程空间,编程开发者的网络收藏夹
学习永远不晚

ansible python api 2

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

ansible python api 2

 最近想利用python来调用anbile来实现一些功能,发现ansible的api已经升级到了2.0,使用上比以前复杂了许多。

 这里我参考了官方文档的例子,做了一些整改,写了一个python调用ansible的函数,执行过程中输出执行结果。函数返回执行结果,便于筛选和存储所需的数据:

# vim exec_ansible.py
from ansible.inventory.manager import InventoryManager
from ansible.playbook.play import Play
from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.plugins.callback import CallbackBase

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
        """
        global exec_result
        host = result._host
        self.data = json.dumps({host.name: result._result}, indent=4)
        exec_result = dict(exec_result,**json.loads(self.data))


def exec_ansible(module,args,host):               
    Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check', 'diff'])
    # initialize needed objects
    loader = DataLoader()
    options = Options(connection='ssh', module_path='/usr/local/lib/python3.6/site-packages/ansible-2.4.1.0-py3.6.egg/ansible/modules/', forks=100, become=None, become_method=None, become_user=None, check=False,diff=False)
    passwords = dict(vault_pass='secret')

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

    # create inventory and pass to var manager
    inventory = InventoryManager(loader=loader, sources=['/etc/ansible/hosts'])
    variable_manager = VariableManager(loader=loader, inventory=inventory)

    # create play with tasks
    play_source =  dict(
            name = "Ansible Play",
            hosts = host,
            gather_facts = 'no',
            tasks = [
                dict(action=dict(module=module, args=args), register='shell_out'),
             ]
        )
    play = Play().load(play_source, variable_manager=variable_manager, loader=loader)

    # actually run it
    tqm = None
    global exec_result
    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
              )
        result = tqm.run(play)
    finally:
        if tqm is not None:
            tqm.cleanup()
        return exec_result


调用例子:

  我本地ansible的hosts文件如下:

# more /etc/ansible/hosts
[testserver]
192.168.52.128
192.168.52.135

  调用如下:

  先调用testserver一组主机批量执行date命令:

>>> from exec_ansible import exec_ansible                             
>>> test1 = exec_ansible(module='shell',args='date',host='testserver')
{
    "192.168.52.135": {
        "warnings": [],
        "stderr": "",
        "delta": "0:00:00.003688",
        "_ansible_no_log": false,
        "stdout": "Sat Nov  5 18:54:17 CST 2016",
        "cmd": "date",
        "_ansible_parsed": true,
        "rc": 0,
        "invocation": {
            "module_args": {
                "removes": null,
                "executable": null,
                "creates": null,
                "chdir": null,
                "warn": true,
                "_raw_params": "date",
                "_uses_shell": true
            },
            "module_name": "command"
        },
        "start": "2016-11-05 18:54:17.563525",
        "changed": true,
        "end": "2016-11-05 18:54:17.567213",
        "stdout_lines": [
            "Sat Nov  5 18:54:17 CST 2016"
        ]
    }
}
{
    "192.168.52.128": {
        "warnings": [],
        "stderr": "",
        "delta": "0:00:00.003244",
        "_ansible_no_log": false,
        "stdout": "Sat Nov  5 21:48:38 CST 2016",
        "cmd": "date",
        "_ansible_parsed": true,
        "rc": 0,
        "invocation": {
            "module_args": {
                "removes": null,
                "executable": null,
                "creates": null,
                "chdir": null,
                "warn": true,
                "_raw_params": "date",
                "_uses_shell": true
            },
            "module_name": "command"
        },
        "start": "2016-11-05 21:48:38.252785",
        "changed": true,
        "end": "2016-11-05 21:48:38.256029",
        "stdout_lines": [
            "Sat Nov  5 21:48:38 CST 2016"
        ]
    }
}

  

 指定单台执行命令:

>>> test2 = exec_ansible(module='shell',args='free -m',host='192.168.52.128')
{
    "192.168.52.128": {
        "warnings": [],
        "changed": true,
        "invocation": {
            "module_args": {
                "_raw_params": "free -m",
                "executable": null,
                "chdir": null,
                "creates": null,
                "removes": null,
                "_uses_shell": true,
                "warn": true
            },
            "module_name": "command"
        },
        "rc": 0,
        "start": "2016-11-05 21:53:10.738545",
        "_ansible_parsed": true,
        "delta": "0:00:00.002871",
        "stdout_lines": [
            "             total       used       free     shared    buffers     cached",
            "Mem:          1869       1786         83          3        312        512",
            "-/+ buffers/cache:        961        908 ",
            "Swap:         4047          3       4044 "
        ],
        "stderr": "",
        "end": "2016-11-05 21:53:10.741416",
        "cmd": "free -m",
        "_ansible_no_log": false,
        "stdout": "             total       used       free     shared    buffers     cached\nMem:          1869       1786         83          3        312        512\n-/+ buffers/cache:        961        908 \nSwap:         4047          3       4044 "
    }
}

 这里可以从输出中取到输出结果:

>>> stdout = test2["192.168.52.128"]["stdout"]
             total       used       free     shared    buffers     cached
Mem:          1869       1756        112          2        314        490
-/+ buffers/cache:        951        917 
Swap:         4047          4       4043


 我写的脚本有个bug,就是当指定一组主机批量执行的时候,返回的函数中,存储内容的只剩下最后执行命令的那台主机的相关信息,做不到把所有的主机的执行信息存储,希望有大神可以解决这个问题,并不吝赐教!!(已解决,参考更改过的exec_ansible脚本)



-------后续更新---------------

注:

      新版本的api相关模块已经修改,故使用方法上也需要整改,本文档的例子已更新api的使用,如上的exec_ansible脚本。


-----bug解决----

     另外,我在脚本中新增了全局空字典参数exec_result={},分别在class ResultCallback和函数exec_result中进行全局函数声明,用以存储执行过程中所产生的stdout输出,以解决之前脚本的bug(返回函数中,存储内容的只剩下最后执行命令的那台主机的相关信息,做不到把所有的主机的执行信息存储)。

      只需在python主体重定义exec_result = {}这个空字典,即可实现。


使用如下:

exec_result = {}
a = exec_ansible("shell","free -m","test")
print(a)
{'192.168.204.128': {'changed': True, 'end': '2017-11-07 15:16:08.970746', 'stdout': '             total       used       free     shared    buffers     cached\nMem:          1990       1918         72          3         89       1280\n-/+ buffers/cache:        548       1441\nSwap:         1999          0       1999', 'cmd': 'free -m', 'rc': 0, 'start': '2017-11-07 15:16:08.964010', 'stderr': '', 'delta': '0:00:00.006736', 'invocation': {'module_args': {'warn': True, 'executable': None, '_uses_shell': True, '_raw_params': 'free -m', 'removes': None, 'creates': None, 'chdir': None, 'stdin': None}}, '_ansible_parsed': True, 'stdout_lines': ['             total       used       free     shared    buffers     cached', 'Mem:          1990       1918         72          3         89       1280', '-/+ buffers/cache:        548       1441', 'Swap:         1999          0       1999'], 'stderr_lines': [], '_ansible_no_log': False, 'failed': False}, '192.168.204.129': {'changed': True, 'end': '2017-11-07 15:16:08.975201', 'stdout': '             total       used       free     shared    buffers     cached\nMem:          1990       1918         72          3         89       1280\n-/+ buffers/cache:        548       1441\nSwap:         1999          0       1999', 'cmd': 'free -m', 'rc': 0, 'start': '2017-11-07 15:16:08.964947', 'stderr': '', 'delta': '0:00:00.010254', 'invocation': {'module_args': {'warn': True, 'executable': None, '_uses_shell': True, '_raw_params': 'free -m', 'removes': None, 'creates': None, 'chdir': None, 'stdin': None}}, '_ansible_parsed': True, 'stdout_lines': ['             total       used       free     shared    buffers     cached', 'Mem:          1990       1918         72          3         89       1280', '-/+ buffers/cache:        548       1441', 'Swap:         1999          0       1999'], 'stderr_lines': [], '_ansible_no_log': False, 'failed': False}}



免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

ansible python api 2

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

ansible python api 2

最近想利用python来调用anbile来实现一些功能,发现ansible的api已经升级到了2.0,使用上比以前复杂了许多。 这里我参考了官方文档的例子,做了一些整改,写了一个python调用ansible的函数,执行过程中输出执行结果。
2023-01-31

redis 详解(2)API

通用命令通用命令命令说明时间复杂度keys [pattern]遍历所有 keyO(n)dbsize计算 key 的总数O(1)del key [key...]删除指定 key-valueO(1)exist key检查 key 是否存在O(1)expire ke
redis 详解(2)API
2022-01-10

Python之 ansible 动态In

1.Ansible Inventory  介绍;Ansible Inventory 是包含静态 Inventory 和动态 Inventory 两部分的,静态 Inventory 指的是在文件中指定的主机和组,动态 Inventory 指通
2023-01-31

Python ansible常用模块

import ansible.runnerimport ansible.playbookimport ansible.inventoryfrom ansible import callbacksfrom ansible import uti
2023-01-31

使用ansible搭建python多版

背景在学习python过程中,centos系统自带的python版本比较滞后。在测试过程中,往往需要多个版本,但又不想影响系统自带的版本;尤其是在学习django过程中,python版本切换更加频繁,因此有了多版本切换需求。在网上查了相关的
2023-01-31

python学习-ansible简单使用

一、介绍Ansible 一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台,是 AnsibleWorks 公司名下的项目,该公司由 Cobbler 及 Func 的作者于 2012 年创建成立。Ansible 基于 Pytho
2023-01-31

Python(2)

一、python是强类型语言:1、两个对象比较:(1)、身份(内存地址):两个对象的引用是否相同。 id(a)==id(b)或者a is b (2)、值:两个对象的数据是否相等。 a==b(3)、类型:两个对象的类型是否相同。 type(a
2023-01-31

python中ansible的作用是什么

本篇文章给大家分享的是有关python中ansible的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python是什么意思Python是一种跨平台的、具有解释性、编
2023-06-14

selenium 2 + python

在使用selenium 2的时候,经常会碰到打开一个页面后新页面以新窗口打开,因为脱离当前窗口需要重新定位窗口,可以用以下方法定位到需要的窗口。#父窗口是0browser.switch_to_window(browser.window_ha
2023-01-31

zero python.2

1.使用函数 2.装饰器 3.异常处理 4.socket 1.使用函数  给函数传递参数时,可以灵活传递实参数量。形参在定义时,使用到列表、字典。# 定义函数def f (hostip, port='52161'):    print('h
2023-01-31

Django1.7+python 2.

配置好virtualenv 和virtualenvwrapper后,使用pycharm创建新项目。之后要面临的问题就来了,之前一直使用的是sqlite作为开发数据库进行学习,按照之前看教程的原则,好像就是说开发环境要和生产环境尽量的一致,所
2023-01-31

Python 2 和 Python 3

Guido(Python之父,仁慈的独裁者)在设计 Python3 的过程中,受一篇文章 “Python warts” 的影响,决定不向后兼容,否则无法修复大多数缺陷。---摘录自《流畅的Python》  你可能从来没有听说过学 Java
2023-01-31

2 . python Collectio

nametuple() 是具有命名字段的元组的工厂函数命名元组为元组中每个位置赋予含义,并允许更具可读性的自编写代码 它们可以在任何使用常规元组的地方使用,并且他们添加了按名称而不是位置索引访问字段的功能。用法:collections.na
2023-01-31

Python作业2

1.分别取出0到10中的偶数和奇数。   2.判断一个数是否是质数 *程序*测试   3题目*程序*测试
2023-01-31

#2 安装Python

上一篇文章主要记录 了Python简介,相信你已经爱上了小P,俗话说的好:公欲善其事,必先利其器,所以本文将带领你安装Python3!Windows平台1.确认Windows位数:鼠标右击此电脑-->打开属性,如下图所示:2.下载对应的Py
2023-01-30

Notes for python (2)

使用列表例9.1 使用列表#!/usr/bin/python# Filename: using_list.py# This is my shopping listshoplist = ['apple', 'mango', 'carrot',
2023-01-31

python 第2天

import easygui,randomsecret = random.randint(1,99)easygui.msgbox("""I have a secret ,It is a number from 1-99 ,you have
2023-01-31

Python小九九--Python 2

for i in range(1, 10): for j in range(1, i+1): print '%s*%s=%s' % (j, i, i*j), # 逗号--不换行输出 print '' # 换行输出
2023-01-31

python 函数(2)

一、内容回顾1.面试题相关:1.py2和py3的区别2.运算符的计算 :3 or 9 and 83.字符串的反转4.is和==的区别5.v1 = (1) v2 = 1 v3 = (1,)有什么区别v1 、v2都是数字,v3是元组6.线上操作
2023-01-31

Python练习【2】

题目1:用Python实现队列(先入先出)入队出队队头队尾队列是否为空显示队列元素代码:list=[] ##定义空列表用于存储数据tip = """******队列******1.入队2.出队3.队头4
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录