使用python脚本在ansible资源清册中使用变量的动态主机

使用python脚本在ansible资源清册中使用变量的动态主机,python,linux,ansible,pipe,lookup,Python,Linux,Ansible,Pipe,Lookup,我希望能够让ansible清单查看数据库,以获得正确的主机 为了实现这一点,我编写了一个Python脚本,从数据库中查询主机名并将其打印为yaml 我运行了一个测试,看看管道查找插件是否能够获得输出: $ ansible webservers -m debug -a "msg={{ lookup('pipe', './gather-hosts.py') }}" {{ lookup('pipe', './gather-hosts.py') }} | SUCCESS =>

我希望能够让ansible清单查看数据库,以获得正确的主机

为了实现这一点,我编写了一个Python脚本,从数据库中查询主机名并将其打印为yaml

我运行了一个测试,看看管道查找插件是否能够获得输出:

$ ansible webservers -m debug -a "msg={{ lookup('pipe', './gather-hosts.py') }}"
{{ lookup('pipe', './gather-hosts.py') }} | SUCCESS => {
    "msg": "web001:\n  descr: External websites\n  phpversion: 7.3\nweb002:\n  descr: External websites\n  phpversion: 7.3\nweb003:\n  descr: Internal websites\n  phpversion: 7.4\nweb004:\n  descr: Internal websites\n  phpversion: 7.4"
}
这似乎可行,我进入了下一步,主机清单文件:

---
webservers:
  hosts: "{{ lookup('pipe', './gather-hosts.py') }}"
当我尝试运行此命令时:

$ ansible-playbook playbook.yml

PLAY [webservers] *****************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************
fatal: [{{ lookup('pipe', './gather-hosts.py') }}]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname {{ lookup('pipe', './gather-hosts.py') }}: Name or service not known", "unreachable": true}

PLAY RECAP ************************************************************************************************************
{{ lookup('pipe', './gather-hosts.py') }} : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0
因此,它不使用管道输出作为webservers:group的数据,而是尝试使用ssh连接到名为{{lookup('pipe',…}}}的服务器上,这显然不起作用

但是,如果我不小心在脚本文件名中输入了一个错误,比如说调用它gather--hosts.py,它会抱怨找不到该文件,因此它实际上是被解释的,但只是不用于用它的内容填充父文件

有人知道我做错了什么吗

如果这样不行,还有别的办法吗

注意:我使用的是ansible 2.10.2和python 3.8.6


注意:如果我去掉变量,只输出主机,这也不起作用。

在剧本中将主机设置为变量,然后将Python脚本中的主机名输出作为变量传递给-e$(),这是错误的。清单的这一部分(即任何非var/事实的信息)是不可“模板化”的就像你尝试过的那样。要么让你的脚本输出一个完整的静态清单,你可以直接使用,要么走路线Hi@RamanSailopal,我不明白你的意思,你能给我举个例子吗?嗨@Zeitounator,我不知道这是可能的!这可能更适合我的需要。我会试试的!谢谢!@Zeitounator,“要么让你的脚本输出一个完整的静态清单,你可以直接使用”,你能给我一些更多的信息吗?我应该在调用ansible之前创建一个我调用的脚本,以便它创建一个清单文件,还是可以让ansible为你调用该脚本?