Как настроить виртуальную среду Ansible для Python? - PullRequest
0 голосов
/ 07 октября 2018

Я сейчас пытаюсь запустить playbook, который использует плагин обратного вызова.Этот плагин использует модуль с именем datadog:

import datadog

Когда я пытаюсь запустить playbook, я получаю сообщение об ошибке:

ImportError: Нет модуля с именем datadog

Я приказываю обойти это, я создал virtualenv, активировал его и установил модуль datadog:

virtualenv ansible -p python2.7
source ./ansible/bin/activate
pip install datadog

Затем, когда я запускаю python и импортирую модуль, все в порядке:

python --version

Python 2.7.15

import datadog
print datadog

<module 'datadog' from
'/Users/admin/code/venvs/ansible/lib/python2.7/site-packages/datadog/__init__.pyc'>

Поэтому я считаю, что модуль используется правильно.

Однако при запуске ANSIBLE PlayBookошибка остается:

ansible-playbook -i ../../local/hosts.ini my_playbook.yml -e "ansible_python_interpreter=/Users/admin/code/venvs/ansible/bin/python" -vvv

ansible-playbook 2.6.3
  config file = /Users/admin/code/src/playbooks/ansible.cfg
  configured module search path = [u'/Users/admin/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/Cellar/ansible/2.6.3/libexec/lib/python2.7/site-packages/ansible
  executable location = /usr/local/bin/ansible-playbook
  python version = 2.7.15 (default, Jul 23 2018, 21:27:06) [GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)]
Using /Users/admin/code/src/playbooks/ansible.cfg as config file
Parsed /Users/admin/code/src/local/hosts.ini inventory source with ini plugin
statically imported: /Users/admin/code/src/playbooks/roles/security/tasks/security-ubuntu.yml
statically imported: /Users/admin/code/src/playbooks/roles/mariadb/tasks/cluster.yml
ERROR! Unexpected Exception, this is probably a bug: No module named datadog

Из того, что я могу сказать, Ansible не принимает во внимание virtualenv.Я ожидал бы, что Ansible будет использовать путь virtualenv в ansible python module location.

Как я могу сделать так, чтобы ansible использовал virtualenv?Я не нашел ничего, связанного с путем к Python, в документации ANSIBLE: https://docs.ansible.com/ansible/2.5/reference_appendices/config.html

Примечание: проблема возникает на компьютере с Ansible.Не предоставляемая машина.

1 Ответ

0 голосов
/ 07 октября 2018

Это кажется нормальным, поскольку Ansible не относится к виртуальной среде Python в вашем случае:

ansible python module location = /usr/local/Cellar/ansible/2.6.3/libexec/lib/python2.7/site-packages/ansible
executable location = /usr/local/bin/ansible-playbook

В virtualenv неустановленные пакеты инициализируются из реальной системной среды.Таким образом, вы можете достичь этого, настроив Ansible в virtualenv

Посмотрите на этот пример:

my_user@my_machine:~$ ansible --version
ansible 2.6.3
  ansible python module location = /usr/local/lib/python2.7/dist-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 2.7.15rc1 (default, Apr 15 2018, 21:51:34) [GCC 7.3.0]

После установки Ansible в virtualenv

(py_venv) my_user@my_machine:~$ pip install ansible==2.5.5

Ansible относится к путям виртуальной среды Python:

(py_venv) my_user@my_machine:~$ ansible --version
ansible 2.5.5
  ansible python module location = /home/my_user/py_venv/local/lib/python2.7/site-packages/ansible
  executable location = /home/my_user/py_venv/bin/ansible
  python version = 2.7.15rc1 (default, Apr 15 2018, 21:51:34) [GCC 7.3.0]

ps: необходимо деактивировать и снова активировать virtualenv один раз, чтобы загрузить Ansible из виртуальной среды послеустановка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...