如何运行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这个问题的答案,我会不断更新这个答案,因为我发现更多的信息。