Проблема с интерпретатором Python для динамической инвентаризации - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь запустить playbook из virtualenv и использую скрипт динамической инвентаризации.Проблема в том, что сценарий инвентаризации использует системный интерпретатор по умолчанию, а не тот, который я передал, используя переменную ansible_python_interpreter.

Playbook работает нормально, если активировать virtualenv и запустить из командной строки.Кроме того, скрипт инвентаризации работает нормально, когда я использую /opt/myproj/.ve/bin/python3.6 inv.py.Но playbook вызывается удаленно другим скриптом 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 должен вызываться с заданным ansible_python_interpreter, где я установил все модули pip.

1 Ответ

1 голос
/ 10 июля 2019

Сценарии Ansible инвентаризации не получают никакого специального поведения замещения Python, как это делают модули.Так как они могут быть написаны на любом языке, единственным требованием является то, что бит выполнения установлен и установлен правильный shebang.Таким образом, он будет буквально запускать все, что говорит шебанг.

Пара вариантов:

  • Сделать шебанг в сценарии инвентаризации #!/usr/bin/env python - который должен наследовать Венонский Питон отконтроллер.
  • Переписать скрипт инвентаризации как плагин инвентаря .Он более сложный, но гораздо более гибкий и работает внутри контроллера, поэтому обходит все проблемы конфигурации Python, когда ваш контроллер работает должным образом.
...