Ansible+Python2 实现批量执行命令

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)

发布了73 篇原创文章 · 获赞 4 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_27592485/article/details/102402650