返回顶部
首页 > 资讯 > 后端开发 > Python >ansible python api 2
  • 625
分享到

ansible python api 2

ansiblepythonapi 2023-01-31 07:01:55 625人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

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

 最近想利用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}}



--结束END--

本文标题: ansible python api 2

本文链接: https://lsjlt.com/news/191505.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ansible python api 2
     最近想利用python来调用anbile来实现一些功能,发现ansible的api已经升级到了2.0,使用上比以前复杂了许多。 这里我参考了官方文档的例子,做了一些整改,写了一个python调用ansible的函数,执行过程中输出执行结果...
    99+
    2023-01-31
    ansible python api
  • redis 详解(2)API
    通用命令 通用命令 命令 说明 时间复杂度 keys [pattern] 遍历所有 key O(n) dbsize 计算 key 的总数 O(1) del key [key...] 删除指定 key-value O(1...
    99+
    2022-01-10
    redis 详解(2)API
  • Python ansible常用模块
    import ansible.runnerimport ansible.playbookimport ansible.inventoryfrom ansible import callbacksfrom ansible import uti...
    99+
    2023-01-31
    模块 常用 Python
  • Python之 ansible 动态In
    1.Ansible Inventory  介绍;Ansible Inventory 是包含静态 Inventory 和动态 Inventory 两部分的,静态 Inventory 指的是在文件中指定的主机和组,动态 Inventory 指通...
    99+
    2023-01-31
    动态 Python ansible
  • python学习-ansible简单使用
    一、介绍Ansible 一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台,是 AnsibleWorks 公司名下的项目,该公司由 Cobbler 及 Func 的作者于 2012 年创建成立。Ansible 基于 Pytho...
    99+
    2023-01-31
    简单 python ansible
  • 使用ansible搭建python多版
    背景 在学习python过程中,centos系统自带的python版本比较滞后。在测试过程中,往往需要多个版本,但又不想影响系统自带的版本;尤其是在学习django过程中,python版本切换更加频繁,因此有了多版本切换需求。 在网上查了...
    99+
    2023-01-31
    ansible python 多版
  • Python(2)
    一、python是强类型语言:1、两个对象比较:(1)、身份(内存地址):两个对象的引用是否相同。 id(a)==id(b)或者a is b (2)、值:两个对象的数据是否相等。 a==b(3)、类型:两个对象的类型是否相同。 type(a...
    99+
    2023-01-31
    Python
  • python中ansible的作用是什么
    本篇文章给大家分享的是有关python中ansible的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python是什么意思Python是一种跨平台的、具有解释性、编...
    99+
    2023-06-14
  • selenium 2 + python
    在使用selenium 2的时候,经常会碰到打开一个页面后新页面以新窗口打开,因为脱离当前窗口需要重新定位窗口,可以用以下方法定位到需要的窗口。#父窗口是0 browser.switch_to_window(browser.window_h...
    99+
    2023-01-31
    selenium python
  • 2 . python Collectio
    nametuple() 是具有命名字段的元组的工厂函数命名元组为元组中每个位置赋予含义,并允许更具可读性的自编写代码 它们可以在任何使用常规元组的地方使用,并且他们添加了按名称而不是位置索引访问字段的功能。用法:collections.na...
    99+
    2023-01-31
    python Collectio
  • Django1.7+python 2.
    配置好virtualenv 和virtualenvwrapper后,使用pycharm创建新项目。之后要面临的问题就来了,之前一直使用的是sqlite作为开发数据库进行学习,按照之前看教程的原则,好像就是说开发环境要和生产环境尽量的一致,...
    99+
    2023-01-31
    python
  • zero python.2
    1.使用函数 2.装饰器 3.异常处理 4.socket 1.使用函数  给函数传递参数时,可以灵活传递实参数量。形参在定义时,使用到列表、字典。# 定义函数 def f (hostip, port='52161'):     print(...
    99+
    2023-01-31
    python
  • Python 2 和 Python 3
      Guido(Python之父,仁慈的独裁者)在设计 Python3 的过程中,受一篇文章 “Python warts” 的影响,决定不向后兼容,否则无法修复大多数缺陷。---摘录自《流畅的Python》   你可能从来没有听说过学 J...
    99+
    2023-01-31
    Python
  • #2 安装Python
    上一篇文章主要记录 了Python简介,相信你已经爱上了小P,俗话说的好:公欲善其事,必先利其器,所以本文将带领你安装Python3! Windows平台 1.确认Windows位数: 鼠标右击此电脑-->打开属性,如下图所示: ...
    99+
    2023-01-30
    Python
  • python 函数(2)
    一、内容回顾 1.面试题相关: 1.py2和py3的区别 2.运算符的计算 :3 or 9 and 8 3.字符串的反转 4.is和==的区别 5.v1 = (1) v2 = 1 v3 = (1,)有什么区别 v1 、v2都是数...
    99+
    2023-01-31
    函数 python
  • Python练习【2】
    题目1: 用Python实现队列(先入先出) 入队 出队 队头 队尾 队列是否为空 显示队列元素 代码: list=[] ##定义空列表用于存储数据 tip = """ ******队...
    99+
    2023-01-31
    Python
  • python练习2
    # 理论性1. 写出python中的几种分支结构,并解释其执行过程;2. 写出python中的几种循环结构,并解释其执行过程;3. python中是否支持switch语句   如果支持,写出该语句格式;   如果不支持,说说python中怎...
    99+
    2023-01-31
    python
  • python 第2天
    import easygui,randomsecret = random.randint(1,99)easygui.msgbox("""I have a secret ,It is a number from 1-99 ,you have ...
    99+
    2023-01-31
    python
  • Notes for python (2)
    使用列表 例9.1 使用列表 #!/usr/bin/python # Filename: using_list.py # This is my shopping list shoplist = ['apple', '...
    99+
    2023-01-31
    Notes python
  • 2.Python基础
    一.语句和语法 一.继续 (\) Python语句,一般使用换行分隔,也就是说一行一个语句, 一行过场的语句可以使用反斜杠"\" 分解成几行. 两种情况列外一个语句不使用反斜杠也可以跨行. 在使用闭合操作符时,单一语句可以哭啊多行....
    99+
    2023-01-31
    基础 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作