Ansible 动态清单 python 解释器问题

Ansible dynamic inventory python interpreter issue

我正在尝试 运行 来自 virtualenv 的剧本,我正在使用 ansible-dynamic 清单脚本。 问题是:清单脚本使用的是默认系统解释器,而不是我使用 "ansible_python_interpreter" 变量传递的系统解释器。

如果从命令行激活 virtualenv 和 运行,剧本可以正常工作。此外,当我 运行 使用 /opt/myproj/.ve/bin/python3.6 inv.py 时,清单脚本工作正常。 但是剧本是由不同的 python 脚本远程调用的,而不是从命令行调用的。

/opt/myproj/.ve/bin/ansible-playbook playbooks/rotate_passwords.yml -i inv.py -e ansible_python_interpreter=/opt/myproj/.ve/bin/python3.6 -vvv
ansible-playbook 2.7.10
  config file = /opt/myproj/ansible.cfg
  configured module search path = ['/opt/myproj/library']
  ansible python module location = /opt/myproj/.ve/lib64/python3.6/site-packages/ansible
  executable location = /opt/myproj/.ve/bin/ansible-playbook
  python version = 3.6.8 (default, Apr 25 2019, 21:02:35) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
Using /opt/myproj/ansible.cfg as config file
setting up inventory plugins
/opt/myproj/inv.py did not meet host_list requirements, check plugin documentation if this is unexpected
/opt/myproj/inv.py did not meet yaml requirements, check plugin documentation if this is unexpected
/opt/myproj/inv.py did not meet auto requirements, check plugin documentation if this is unexpected
 [WARNING]:  * Failed to parse /opt/myproj/inv.py with script plugin: Inventory script (/opt/myproj/inv.py) had an execution error: Traceback (most recent call last):
File "/opt/myproj/inv.py", line 11, in <module>     import pymysql.cursors ModuleNotFoundError: No module named 'pymysql'

我希望 inv.py 应该在我安装了所有 pip 模块的给定 ansible_python_interpreter 中被调用。

Ansible 清单脚本不会像模块那样收到任何特殊的 Python 替换行为。因为它们可以用任何语言编写,所以唯一的要求是设置执行位并且有一个有效的 shebang。所以无论 shebang 说什么,它都会 运行。

几个选项:

  • 在清单脚本中创建 shebang #!/usr/bin/env python - 应该从控制器继承 venv Python。
  • 将库存脚本重写为 inventory plugin。它更复杂,但更灵活,并且 运行s 在控制器内部,因此一旦您的控制器正常工作,就可以回避任何 Python 配置问题。