#!/usr/bin/env python
# -*- coding:utf-8 -*- import json
import shutil
from collections import namedtuple
from ansible.parsing.dataloader import DataLoader
from ansible.inventory.manager import InventoryManager
from ansible.vars.manager import VariableManager
from ansible.playbook.play import Play
from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.plugins.callback import CallbackBase
import ansible.constants as C class ResultCallback(CallbackBase):
"""
一个用于在结果出现时执行操作的回调插件示例;
如果要将所有结果收集到单个对象中以便在执行结束时进行处理;
请查看使用``json``回调插件或编写自己的自定义回调插件。
"""
def v2_runner_on_ok(self, result, **kwargs):
"""
以 JSON 形式打印结果
此方法可以将结果存储在实例属性中以便稍后检索
"""
host = result._host
print(json.dumps({host.name: result._result}, indent=4)) # 由于 API 是为 CLI 构建的,因此需要始终设置某些选项,命名元组伪造的 args 解析选项对象
module_path = '/usr/lib/python2.7/site-packages/ansible/module'
Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check', 'diff'])
options = Options(connection='ssh', module_path=[module_path], forks=10, become=None, become_method=None, become_user=None, check=False, diff=False) # 初始化所需的对象
loader = DataLoader() # 负责查找和阅读 yaml、json、ini文件
print(loader)
# 设置ansible密码
passwords = dict(conn_pass='coolops@123456') # 实例化 ResultCallback 以便在进入时处理结果,Ansible 希望这是它的主要展示渠道之一
results_callback = ResultCallback() # 创建 inventory 使用路径将主机配置文件作为源,或以逗号分隔的字符串中的主机
inventory = InventoryManager(loader=loader, sources='127.0.0.1')
# inventory = InventoryManager(loader=loader, sources='/etc/ansible/hosts') # 变量管理器负责合并所有不同的源,为您提供每个上下文中可用变量的统一视图
variable_manager = VariableManager(loader=loader, inventory=inventory) # 创建表示我们的 play 的数据结构,包括任务,这基本上是我们的 YAML 加载器在内部执行的操作
play_source = dict(
name = "Ansible Play",
hosts = '127.0.0.1',
gather_facts = 'yes',
tasks = [
dict(action=dict(module='shell', args='hostname'), register='shell_out'),
#dict(action=dict(module='debug', args=dict(msg='{{shell_out.stdout}}')))
]
) # 创建 play 对象, playbook 对象使用 .load 而不是 init 或 new 方法,这也将自动从 play_source 中提供的信息创建任务对象
play = Play().load(play_source, variable_manager=variable_manager, loader=loader) # 运行它 - 实例化任务队列管理器,它负责 forking 和设置所有对象以迭代主机列表和任务
tqm = None
try:
tqm = TaskQueueManager(
inventory=inventory,
variable_manager=variable_manager,
loader=loader,
options=options,
passwords=passwords,
stdout_callback=results_callback, # 使用我们的自定义回调而不是``default``回调插件,它打印到stdout
)
result = tqm.run(play) # 一个 play 的数据实际上是发送到回调的方法
finally:
# 我们总是需要清理子进程和我们用来与它们通信的结构
if tqm is not None:
tqm.cleanup() # 删除 ansible 临时目录
shutil.rmtree(C.DEFAULT_LOCAL_TMP, True)

python操作ansible api示例的更多相关文章

  1. Python调用ansible API系列(五)综合使用

    如何把动态生成资产信息.执行playbook以及自定义结果结合起来用呢? #!/usr/bin/env python # -*- coding: utf-8 -*- """ ...

  2. Python调用ansible API系列(四)动态生成hosts文件

    方法一:通过最原始的操作文件的方式 #!/usr/bin/env python # -*- coding: utf-8 -*- """ 通过操作文件形式动态生成ansib ...

  3. Python调用ansible API系列(一)获取资产信息

    你想让ansible工作首先就需要设置资产信息,那么我们如何通过使用Python调取Ansible的API来获取资产信息呢? 要提前准备一个hosts文件 获取组或者主机 #!/usr/bin/env ...

  4. Python操作MongoDB代码示例

    import pymongo #pip install pymongo安装python操作mongodb的模块 myclient=pymongo.MongoClient(host='127.0.0.1 ...

  5. python 操作 saltstack Api(二) 示例

    获取token #!/usr/bin/env python #-*-coding:utf--*- import urllib import urllib.parse import urllib.req ...

  6. Python 操作 GA API 指南

    因为需要写一个 Blog Feature 的缘故,所以接触了下 GA 的 Python API,发现 G 家的 API 不是那么直观,比较绕,但是,在使用过程中发现其实 G 家的 API 设计挺有意思 ...

  7. Python调用ansible API系列(三)带有callback的执行adhoc和playbook

    在第二篇文章中虽然可以执行adhoc和playbook但是执行结果的输出并不是特别直观,虽然没有报错但是到底什么结果其实你是不知道的尤其是在执行adhoc的时候,这时候我们要利用callback来设置 ...

  8. Python调用ansible API系列(二)执行adhoc和playbook

    执行adhoc #!/usr/bin/env python # -*- coding: utf-8 -*- import sys from collections import namedtuple ...

  9. python操作Mysql数据库示例

    python库:pymysql 安装:install pymysql.mysql数据库 一.连接数据库.创建speder库.查询版本. import pymysql ##链接数据库 db = pymy ...

随机推荐

  1. Python设计模式(5)-代理模式

    # coding=utf-8 # 代理模式:# * 代理类成为实际想调用对象的中间件,可以控制对实际调用对象的访问权限# * 可以维护实际对象的引用 class DbManager: def __in ...

  2. Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j)

    Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j) 博客分类: Java综合   第一.Logger.getLogger()和Log ...

  3. 新版本Xcode 6的视图调试详解

    开发者会经常遇到视图或者Auto Layout约束中存在bug的情况,并且这种bug很难通过代码发现,所以开发者很有必要熟知如何进行简单高效的视图调试,而Xcode 6的发布使得视图调试变得前所未有的 ...

  4. CentOS7.5 使用Docker部署Jumpserver

    1.环境准备 # 查看系统版本 $ cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) # 查看内核版本 $ uname -a L ...

  5. Volatile不保证原子性(二)

    Volatile不保证原子性 前言 通过前面对JMM的介绍,我们知道,各个线程对主内存中共享变量的操作都是各个线程各自拷贝到自己的工作内存进行操作后在写回到主内存中的. 这就可能存在一个线程AAA修改 ...

  6. DES原理及代码实现

    一.DES基础知识DES技术特点 DES是一种用56位密钥来加密64位数据的方法    DES采取了分组加密算法:明文和密文为64位分组长度    DES采取了对称算法:加密和解密除密钥编排不同外,使 ...

  7. google protobuf c++ 反射

    const Descriptor *desc = DescriptorPool::generated_pool()->FindMessageTypeByName(msg_name); asser ...

  8. 词向量模型word2vector详解

    目录 前言 1.背景知识 1.1.词向量 1.2.one-hot模型 1.3.word2vec模型 1.3.1.单个单词到单个单词的例子 1.3.2.单个单词到单个单词的推导 2.CBOW模型 3.s ...

  9. python web的进化历程

    对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 阶段1 socket服务端和客户端都自己编写 实现访问8080端口,返回一个'hello wo ...

  10. 线程Event

    版本一: from threading import Event,current_thread,Thread import time event=Event() #造一个对象,内部维护一个全局变量,状 ...