我想在Python中运行Ansible,而不通过(ANSIBLE_HOST)指定清单文件,而仅通过以下方式:
ansible.run.Runner(
module_name='ping',
host='www.google.com'
)
我实际上可以轻松地在Fabric中执行此操作,但只是想知道如何在Python中执行此操作。另一方面,用于Python的Ansible API的文档还不是很完整。
Answers:
令人惊讶的是,诀窍是要添加一个 ,
# 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
之前的host参数,
可以是主机名或IPv4 / v6地址。
我知道这个问题确实很老,但是认为这个小技巧可能对将来需要帮助的用户有所帮助:
ansible-playbook -i 10.254.3.133, site.yml
如果您为本地主机运行:
ansible-playbook -i localhost, --connection=local site.yml
诀窍是,在ip地址/ dns名称后,在逗号中加上逗号,并hosts: all
在剧本中要求' '。
希望这会有所帮助。
'localhost,'
或localhost,
,则在两种情况下ansible-playbook
都会从shell接收相同的参数。并且'localhost',
将以相同的方式求值(这里的关键是引号在将参数传递给命令之前由外壳程序解释)。
hosts: all
当我打算一次只在一台主机上运行一本剧本时,我感到有些冒险。一位同事可能不使用而运行剧本-i
。这是一个不错的解决方案,但我仍在寻找更安全的方法。仍在搜寻...
您可以执行以下操作:
hosts = ["webserver1","webserver2"]
webInventory = ansible.inventory.Inventory(hosts)
webPing = ansible.runner.Runner(
pattern='webserver*',
module_name='ping',
inventory = webInventory
).run()
主机中的任何东西都将成为您的清单,您可以使用模式进行搜索(或“全部”执行)。
我还需要驱动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()