上篇 api 的文章 《》 介绍的是直接将 tasks 直接写在 代码中的,本文介绍 api 运行整个项目
[root@10_1_162_39 host_vars]# cat test1.yaml ---- hosts: 10.1.167.36 gather_facts: false tasks: - shell: ifconfig register: output - debug: var=output.stdout
hosts 可以配置密码,暂时不知道怎么在代码 host_list 中配置不同的密码
root@10_1_162_39 host_vars]# cat hosts [web]10.1.162.18:322 10.1.167.36:32200 ansible_ssh_port=32200 ansible_ssh_pass=test***
test_api_2.py 如下
#!/bin/env python# -*- coding:utf8 -*-from collections import namedtuplefrom ansible.parsing.dataloader import DataLoaderfrom ansible.vars import VariableManagerfrom ansible.inventory import Inventoryfrom ansible.executor.playbook_executor import PlaybookExecutorloader = DataLoader()variable_manager = VariableManager()inventory = Inventory(loader=loader, variable_manager=variable_manager,host_list='hosts')variable_manager.set_inventory(inventory)passwords=NoneOptions = namedtuple('Options', ['connection', 'remote_user', 'ask_sudo_pass', 'verbosity', 'ack_pass', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check', 'listhosts', 'listtasks', 'listtags', 'syntax', 'sudo_user', 'sudo'])options = Options(connection='smart', remote_user='root', ack_pass=None, sudo_user='root', forks=100, sudo='yes', ask_sudo_pass=False, verbosity=5, module_path=None, become=True, become_method='sudo', become_user='root', check=None, listhosts=None, listtasks=None, listtags=None, syntax=None)# 多个yaml文件则以列表形式playbook = PlaybookExecutor(playbooks=['test1.yaml'],inventory=inventory, variable_manager=variable_manager, loader=loader,options=options,passwords=passwords)result = playbook.run()print result
playbook_executor 是不能自定义 callback的,所以输出是标准输出,result 是返回码,0表示全部运行成功,其他代码解释参考上篇文章。
输出
[root@10_1_162_39 host_vars]# python test_api_2.py PLAY [10.1.167.36] *************************************************************TASK [command] *****************************************************************changed: [10.1.167.36]TASK [debug] *******************************************************************ok: [10.1.167.36] => { "output.stdout": "eno16777736: flags=4163mtu 1500\n inet 192.168.142.129 netmask 255.255.255.0 broadcast 192.168.142.255\n inet6 fe80::20c:29ff:fe9e:335f prefixlen 64 scopeid 0x20 \n ether 00:0c:29:9e:33:5f txqueuelen 1000 (Ethernet)\n RX packets 54015 bytes 6112394 (5.8 MiB)\n RX errors 0 dropped 0 overruns 0 frame 0\n TX packets 5675 bytes 898005 (876.9 KiB)\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0\n\nlo: flags=73 mtu 65536\n inet 127.0.0.1 netmask 255.0.0.0\n inet6 ::1 prefixlen 128 scopeid 0x10 \n loop txqueuelen 1 (Local Loopback)\n RX packets 4 bytes 340 (340.0 B)\n RX errors 0 dropped 0 overruns 0 frame 0\n TX packets 4 bytes 340 (340.0 B)\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0\n\nvirbr0: flags=4099 mtu 1500\n inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255\n ether 52:54:00:2b:6f:35 txqueuelen 1000 (Ethernet)\n RX packets 0 bytes 0 (0.0 B)\n RX errors 0 dropped 0 overruns 0 frame 0\n TX packets 0 bytes 0 (0.0 B)\n TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0"}PLAY RECAP *********************************************************************10.1.167.36 : ok=2 changed=1 unreachable=0 failed=0 0[root@10_1_162_39 host_vars]#