【发布时间】:2019-10-11 08:30:56
【问题描述】:
我已经按照官方 ansible 文档克隆了 ansible 存储库和设置。
我通过为 python3 创建venv 直接从源代码进行设置。
运行这个:. venv/bin/activate && . hacking/env-setup 确实设置了 ansible 环境。如果我写这个(venv 被激活):
ansible-playbook --version
它输出这个:
ansible-playbook 2.8.5.post0
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/oerp/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /home/oerp/src/ansible/lib/ansible
executable location = /home/oerp/src/ansible/bin/ansible-playbook
python version = 3.6.7 (default, Mar 29 2019, 10:38:28) [GCC 5.4.0 20160609]
所以它确实表明它使用了 Python 版本 3.6.7。如果我为具有 python 3.6 语法的自定义模块运行单元测试,测试运行良好(测试使用 tox 运行,如 ansible 本身所记录的那样)。
但它无法通过剧本运行我的模块。看起来它正在使用python2执行它。
当我运行这个命令时:
ansible-playbook --extra-vars "target=local_stage" --connection=local /home/oerp/src/ansible-playbooks/buildout_test.yml -vvv
它抛出这个回溯:
The full traceback is:
Traceback (most recent call last):
File "/home/oerp/.ansible/tmp/ansible-tmp-1570781848.1110492-2720137190388/AnsiballZ_focusate_buildout.py", line 114, in <module>
_ansiballz_main()
File "/home/oerp/.ansible/tmp/ansible-tmp-1570781848.1110492-2720137190388/AnsiballZ_focusate_buildout.py", line 106, in _ansiballz_main
invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)
File "/home/oerp/.ansible/tmp/ansible-tmp-1570781848.1110492-2720137190388/AnsiballZ_focusate_buildout.py", line 49, in invoke_module
imp.load_module('__main__', mod, module, MOD_DESC)
File "/tmp/ansible_focusate_buildout_payload_JDfOK3/__main__.py", line 52
path: str,
^
SyntaxError: invalid syntax
显然它不识别打字语法。查看调试,我可以看到正在执行这样的二进制文件:
<stage-my-domain.com> EXEC /bin/sh -c '/usr/bin/python /home/oerp/.ansible/tmp/ansible-tmp-1570781848.1110492-2720137190388/AnsiballZ_my_buildout.py && sleep 0'
在我的环境中/usr/bin/python --version,是Python 2.7.12
调试也显示此信息:
<stage-my-domain.com> EXEC /bin/sh -c 'echo PLATFORM; uname; echo FOUND; command -v '"'"'/usr/bin/python'"'"'; command -v '"'"'python3.7'"'"'; command -v '"'"'python3.6'"'"'; command -v '"'"'python3.5'"'"'; command -v '"'"'python2.7'"'"'; command -v '"'"'python2.6'"'"'; command -v '"'"'/usr/libexec/platform-python'"'"'; command -v '"'"'/usr/bin/python3'"'"'; command -v '"'"'python'"'"'; echo ENDFOUND && sleep 0'
有谁知道为什么 ansible 会忽略激活的 venv 而只使用全局 python 即 python2?
附:我还通过apt-get install ansible 全局安装了ansible。
【问题讨论】:
标签: python python-3.x ansible python-venv