1

我想使用 ansible_runner 对主机进行一些解析。我有一个脚本,它从数据库中收集主机列表,然后我想将该列表传递给 ansible_runner python 模块,而不将“库存”写入磁盘。

根据我从文档中可以理解的内容,我尝试这样做:

>> import ansible_runner
>> hostlist = ['host1', 'host2']
>>> r = ansible_runner.run(private_data_dir='.',inventory=hostlist, playbook='check_ping.yml')

我似乎将我传递的列表中的每个元素都视为位于清单目录中的清单文件。我只想将列表中的元素用作要使用的主机,在这种情况下执行 ping。

我的问题是如何将库存变量传递给 ansible_runner python 模块是否是 json 文件、列表、字典,它在磁盘上的任何位置都不存在?并让 ansible 连接到那些。

4

2 回答 2

1

如图所示构建一个嵌套字典。给一个可迭代的主机

hosts = {r:None for r in hostsiwant}
inv = {'all': {'hosts': hosts}}
r = ansible_runner.run(inventory=inv, #remaining arguments as needed
                                           
于 2021-03-15T22:37:03.600 回答
0

ansible_runner.run()接受以下参数值inventory

  1. private_data_dir 中库存文件的路径
  2. 支持 YAML/json 库存结构的原生 python dict
  3. 文本 INI 格式的字符串
  4. 库存来源列表,或用于禁用传递库存的空列表

该参数的默认值,如果未传递,则为private_data_dir/inventory目录。传递此参数会覆盖清单目录/文件。文档在这里

在问题中给出的代码示例中,主机列表作为inventory参数值传递,并且根据设计,列表值被视为清单源文件列表。

例子:

  • 将库存作为字典传递:

可以使用 python 构建包含所有必需详细信息的字典并作为ansible_runner.run(inventory=my_inventory).

web_server并将backend_server成为主机组名称。


import ansible_runner

my_inventory = {
  "web_server": {
    "hosts": {
      "webserver_1.example.com": {
        "ansible_user": "test",
        "ansible_ssh_private_key_file": "test_user.pem",
        "ansible_host": "webserver_1.example.com"
      },
      "webserver_2.example.com": {
        "ansible_user": "test",
        "ansible_ssh_private_key_file": "test_user.pem",
        "ansible_host": "webserver_1.example.com"
      }
    }
  },
  "backend_server": {
    "hosts": {
      "backend_server_1.example.com": {
        "ansible_user": "test",
        "ansible_ssh_private_key_file": "test_user.pem",
        "ansible_host": "backend_server_1.example.com"
      }
    }
  }
}

runner_result = ansible_runner.run(private_data_dir='.', inventory=my_inventory, playbook='check_ping.yml')
print(runner_result.stats)

注意:这样做会将内容保存在目录中的hosts.json文件中private_data_dir/inventory

  • 写入库存文件:

另一种方法是将 YAML/json 格式的主机详细信息写入private_data_dir/inventory目录内的文件中。

于 2021-10-22T12:22:23.817 回答