我想在 Python 中运行 Ansible 而不通过 (ANSIBLE_HOST) 指定库存文件,但只需:
ansible.run.Runner(
module_name='ping',
host='www.google.com'
)
我实际上可以很容易地在织物中做到这一点,但只是想知道如何在 Python 中做到这一点。另一方面,Ansible API for python 的文档并不完整。
令人惊讶的是,诀窍是附加一个,
# 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: all
在我的剧本中包含,因为如果有人运行剧本并忘记包含-i 10.254.3.133,
这是我的解决方案(ansible 2.6):
$ ansible-playbook myplaybook.yml -e "{target: 10.1.1.1}" -i 10.1.1.1, ...
然后,在剧本中:
- hosts: "{{ target }}"
remote_user: donn
vars_files:
- myvars
roles:
- myrole
当我需要配置主机并且我不想/不需要将其添加到清单中时,这是一个特殊的用例。
你可以这样做:
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()
根据我的理解,一个非常简单的解决方案,如果分散注意力,请道歉。
这里有3个主要步骤需要在那里,
ansible-playbook -l "主机名" <playbook.yml>
请注意,主机名是节点的 $hostname
- hosts: webservers
tasks:
- debug:
msg: "{{ ansible_ssh_host }}"
when: inventory_hostname in groups['webservers']
TASK [debug] ***********************************************************************************************************************************************************
Thursday 10 December 2020 13:01:07 +0530 (0:00:03.153) 0:00:03.363 *****
ok: [node1] => {
"msg": "192.168.1.186"
}
这就是我们可以使用--limit 或 -l选项在特定节点上执行任务的方式