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 配置问题。
我正在尝试 运行 来自 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 配置问题。