ansible 2.6版本的api接口网址:https://docs.ansible.com/ansible/2.6/dev_guide/developing_api.html#python-api-example
在这里可以找到ansible 2.6版本的api接口和example,根据官方示例进行合适修改即可工作
本文是ansible与python2.7结合使用
代码如下:
#!/usr/bin/env python
#!coding: utf8
import shutil
from collections import namedtuple
from ansible.parsing.dataloader import DataLoader
from ansible.vars.manager import VariableManager
from ansible.inventory.manager import InventoryManager
from ansible.playbook.play import Play
from ansible.executor.task_queue_manager import TaskQueueManager
import ansible.constants as C
# 把ansible的选项,用命名元组的方式设定,并且赋值。
# 其中connection为有local,ssh,smart。使用smart会根据实际情况自动应用local或者ssh。module_path是模块的路径。保持即可。forks是多进程执行。不宜过多。保持即可。
Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check', 'diff'])
options = Options(connection='smart', module_path=['/to/mymodules'], forks=10, become=None, become_method=None, become_user=None, check=False, diff=False)
# 使用DataLoader模块,此模块的作用是查询并且解析所提供的文件,例如yaml格式,json格式,ini格式。
# passwords此项的作用是做文件的加密和解密的工作的。一般情况下是无需使用,所以此字典为空
loader = DataLoader()
passwords = dict()
# 使用InventoryManager模块定义inventory属性,一般是字符串或者是一个文件。我们这里是把主机的数据已经写入了hosts文件里面了。那么这里应该是hosts文件的路径
inventory = InventoryManager(loader=loader, sources='/root/myansible/hosts')
# 使用VariableManager模块来管理变量
variable_manager = VariableManager(loader=loader, inventory=inventory)
# 创建一个play。里面的字段含义是play的名称,生效的主机,是否收集信息,任务。
play_source = dict(
name = "Ansible Play",
hosts = 'all',
gather_facts = 'no',
tasks = [
dict(action=dict(module='shell', args='ls'), register='shell_out'),
dict(action=dict(module='debug', args=dict(msg='{{shell_out}}')))
]
)
# 使用Play模块,导入参数,生成实例
play = Play().load(play_source, variable_manager=variable_manager, loader=loader)
# 使用TaskQueueManager模块。运行实例。
tqm = None
try:
tqm = TaskQueueManager(
inventory=inventory,
variable_manager=variable_manager,
loader=loader,
options=options,
passwords=passwords,
)
result = tqm.run(play) # 返回结果
finally:
# 最后无论如何都执行ansible的清理工作。ansible的工作过程是第一次ssh连接,
# 在目标主机创建临时目录。断开连接。第二次ssh连接,在目标主机传送ansible的命令文件,
# 断开连接。第三次ssh连接,给命令文件修改执行权限,断开连接。第四次ssh连接,执行命令。
# 获得返回结果的json信息,然后删除临时目录,断开连接。
if tqm is not None:
tqm.cleanup()
# 最后无论如何都执行ansible的清理工作。
shutil.rmtree(C.DEFAULT_LOCAL_TMP, True)