Я клонировал ANSI-репозиторий и настройку в соответствии с официальной ANSI-документацией.
У меня есть настройки непосредственно из источника, путем создания venv
для Python3.
Выполнение этого: . venv/bin/activate && . hacking/env-setup
действительно устанавливаетв хорошей среде. И если я напишу это (в то время как 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).
Но он не запускает мой модуль через playbook,И похоже, что он выполняет его, используя 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?
PS У меня также есть ansible, установленный глобально через apt-get install ansible
.