如何运行Ansible而不直接指定库存,而是直接指定主机?
我想在Python中运行Ansible而不通过(ANSIBLE_HOST)指定清单文件,只是通过:
ansible.run.Runner( module_name='ping', host='www.google.com' )
我实际上可以很容易地做到这一点,但只是想知道如何在Python中做到这一点。 另一方面,用于Python的Ansible API的文档并不完整。
令人惊讶的是,诀窍是追加一个,
# Host and IP address ansible all -i example.com, ansible all -i 93.184.216.119,
要么
# Requires 'hosts: all' in your playbook ansible-playbook -i example.com, playbook.yml
之前的主机参数可以是主机名或IPv4 / v6地址。
我知道这个问题真的很老,但认为这个小技巧可能对未来需要帮助的用户有所帮助:
ansible-playbook -i '10.254.3.133,' site.yml
如果你运行本地主机:
ansible-playbook -i 'localhost,' --connection=local site.yml
诀窍是,在IP地址/ DNS名称之后,把逗号放在引号内,并在你的手册中需要“ hosts: all
”。
希望这会有所帮助。
你可以这样做:
hosts = ["webserver1","webserver2"] webInventory = ansible.inventory.Inventory(hosts) webPing = ansible.runner.Runner( pattern='webserver*', module_name='ping', inventory = webInventory ).run()
无论是在主机成为你的库存,你可以search模式(或做“所有”)。
我还需要驱动Ansible Python API ,而不是传递主机作为参数,而不是保持清单。 我使用了一个临时文件来绕过Ansible的要求,这可能对其他人有帮助:
from tempfile import NamedTemporaryFile from ansible.inventory import Inventory from ansible.runner import Runner def load_temporary_inventory(content): tmpfile = NamedTemporaryFile() try: tmpfile.write(content) tmpfile.seek(0) inventory = Inventory(tmpfile.name) finally: tmpfile.close() return inventory def ping(hostname): inventory = load_temporary_inventory(hostname) runner = Runner( module_name='ping', inventory=inventory, ) return runner.run()
这不是一个完整的答案,但在这个讨论主题中有一些关于这个主题的讨论 。 在该线程的第一篇文章的末尾,提出了一个build议来创build一个可靠的剧本的封装bash脚本,这是一个黑客行为,但可行。
我一直在考虑的其他事情是使用“无法拉动”和创build一个可靠的库存插件。 我也有兴趣find这个问题的答案,我会不断更新这个答案,因为我发现更多的信息。