Ansible: playbook не работает с python3 - PullRequest
1 голос
/ 11 октября 2019

Я клонировал 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.

1 Ответ

0 голосов
/ 11 октября 2019

venv немного сложнее в использовании. Это связано с вашей сессией. Ansible использует другой сеанс при выполнении, чем вы, как пользователь, который входит в систему. Вам нужно активировать venv для этого конкретного сеанса, который Ansible использует при выполнении.

Вы можете попробовать две вещи:

1: установка переменных среды:

environment:
  PATH: "{{ ansible_env.PATH }}:/yourpython/bin"
  SOME: value

2: установка интерпретатора Python Ansible

https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#how-do-i-handle-python-not-having-a-python-interpreter-at-usr-bin-python-on-a-remote-machine

Установка переменной инвентаризации ansible_python_interpreter на любом хосте будетСкажите Ansible для автоматической замены интерпретатора Python на это значение. Таким образом, вы можете указать на любой Python, который вы хотите в системе, если / usr / bin / python в вашей системе не указывает на совместимый интерпретатор Python.

На некоторых платформах по умолчанию может быть установлен только Python 3. Если он не установлен как / usr / bin / python, вам нужно будет настроить путь к интерпретатору через ansible_python_interpreter. Хотя большинство основных модулей будут работать с Python 3, могут быть некоторые специальные, которые этого не делают, или вы можете столкнуться с ошибкой в ​​крайнем случае. В качестве временного решения вы можете установить Python 2 на управляемом хосте и настроить Ansible для использования этого Python через ansible_python_interpreter.

...