0

我正在尝试在 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 字符串时,它正在那里写入。然而...

  1. 我仍然收到错误no hosts matched
  2. 如果我再次尝试运行我的脚本,ansible-runner 会给我一个文件权限被拒绝错误,inventory/hosts因为它仍然锁定文件。如何让 ansible-runner 放弃该锁?这可能是由于问题 1 造成的no hosts matched,但这是正常的运行状态,我原以为 ansible-runner 可以处理并干净地关闭。
4

0 回答 0