我正在尝试在 python 脚本中使用 ansible-runner。我的主机列表是从数据库动态生成的。我想将此主机列表作为字符串直接传递给 ansible-runner(而不是作为对文件的引用)
这是我的跑步者命令
import ansible_runner
def new_server(inventory):
print(inventory)
return ansible_runner.run(inventory=inventory, private_data_dir="./ansible_lib", playbook="ping.yml")
这是我的库存的样子
{"_meta": {"hostvars": {}}, "17041958": {"hosts": ["157.*.*.251"]}}
这是我的 private_data_dir 结构
= ansbile_lib
== env
=== ssh_key
== inventory
=== hosts //This file is empty, but without it, ansible-runner refuses to run
== project
=== ping.yml
ansible-runner 的输出是
[WARNING]: Unable to parse /Users/soxprox/Development/soxprox/code/soxprox_code
_server_automation_python/ansible_lib/project/ansible_lib/inventory/hosts as an
inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
PLAY [ping a host] *************************************************************
skipping: no hosts matched
PLAY RECAP *********************************************************************
如您所见,即使我将 json 字符串传递给 inventory 参数,anisble-runner 仍在尝试从 hosts 文件中读取主机。我已经直接用 ansible 测试了这种 json 格式(通过将 ansible 指向 python 脚本),它工作得很好。
编辑
我刚刚注意到我的inventory/hosts
文件中有内容。当 ansible-runner 接收到 json 字符串时,它正在那里写入。然而...
- 我仍然收到错误
no hosts matched
- 如果我再次尝试运行我的脚本,ansible-runner 会给我一个文件权限被拒绝错误,
inventory/hosts
因为它仍然锁定文件。如何让 ansible-runner 放弃该锁?这可能是由于问题 1 造成的no hosts matched
,但这是正常的运行状态,我原以为 ansible-runner 可以处理并干净地关闭。