Ansible с использованием python3 virtualenv не работает с python3 site-пакетами - PullRequest
0 голосов
/ 24 апреля 2020

Как воспроизвести проблему:

  1. Установить Ansible "внешнюю" виртуальную среду /usr/bin/python3 -m pip install ansible
  2. Установить python3 Виртуальная среда python3 -m venv /usr/local/kaas_virtualenv
  3. Установите модуль python в виртуальную среду /usr/local/kaas_virtualenv/bin/python3 -m pip install jmespath

Ansible playbook и инвентарь:

playbook.yaml

---
- hosts: control_host
  gather_facts: yes
  become: no
  environment:
    PYTHONPATH: "/usr/local/kaas_virtualenv/lib/python3.7/site-packages"

  vars:
    my_users:
      - password: 123
        username: broker
      - password: 321
        username: broker2
      - password: 213
        username: broker3

  tasks:
    - name: print users
      debug:
        msg: "users = {{ my_users|json_query('[*].username') }}"

server_inventory

[control_host]
localhost

[control_host:vars]
ansible_connection=local
ansible_python_interpreter=/usr/local/kaas_virtualenv/bin/python3

Запустить playbook: ansible-playbook -i server_inventory playbook.yaml

Ожидаемый результат:

PLAY [control_host] ***********************

TASK [Gathering Facts] ***********************
ok: [localhost]

TASK [print users] ***********************
ok: [localhost] => {}

MSG:

users = ['broker', 'broker2', 'broker3']

PLAY RECAP ***********************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Фактический вывод:

bash-4.2# ansible-playbook -i server_inventory playbook.yaml -vvvv
ansible-playbook 2.9.6
  config file = /ansible-dev/swap/ansible.cfg
  configured module search path = ['/ansible-dev/swap/library']
  ansible python module location = /usr/local/lib/python3.7/site-packages/ansible
  executable location = /usr/local/bin/ansible-playbook
  python version = 3.7.6 (default, Feb 26 2020, 20:54:15) [GCC 7.3.1 20180712 (Red Hat 7.3.1-6)]
Using /ansible-dev/swap/ansible.cfg as config file
setting up inventory plugins
host_list declined parsing /ansible-dev/swap/server_inventory as it did not pass its verify_file() method
script declined parsing /ansible-dev/swap/server_inventory as it did not pass its verify_file() method
auto declined parsing /ansible-dev/swap/server_inventory as it did not pass its verify_file() method
Set default localhost to localhost
Parsed /ansible-dev/swap/server_inventory inventory source with ini plugin
Loading callback plugin debug of type stdout, v2.0 from /usr/local/lib/python3.7/site-packages/ansible/plugins/callback/debug.py

PLAYBOOK: playbook.yaml ***********************
Positional arguments: playbook.yaml
verbosity: 4
connection: smart
timeout: 10
become_method: sudo
tags: ('all',)
inventory: ('/ansible-dev/swap/server_inventory',)
forks: 5
1 plays in playbook.yaml

PLAY [control_host] ***********************

TASK [Gathering Facts] ***********************
task path: /ansible-dev/swap/playbook.yaml:2
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root
<localhost> EXEC /bin/sh -c 'echo ~root && sleep 0'
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo /root/.ansible/tmp/ansible-tmp-1587713210.496898-92940637298090 `" && echo ansible-tmp-1587713210.496898-92940637298090="` echo /root/.ansible/tmp/ansible-tmp-1587713210.496898-92940637298090 `" ) && sleep 0'
Using module file /usr/local/lib/python3.7/site-packages/ansible/modules/system/setup.py
<localhost> PUT /root/.ansible/tmp/ansible-local-3398m567tl8a/tmprytb4g6g TO /root/.ansible/tmp/ansible-tmp-1587713210.496898-92940637298090/AnsiballZ_setup.py
<localhost> EXEC /bin/sh -c 'chmod u+x /root/.ansible/tmp/ansible-tmp-1587713210.496898-92940637298090/ /root/.ansible/tmp/ansible-tmp-1587713210.496898-92940637298090/AnsiballZ_setup.py && sleep 0'
<localhost> EXEC /bin/sh -c 'PYTHONPATH=/usr/local/kaas_virtualenv/lib/python3.7/site-packages /usr/local/kaas_virtualenv/bin/python3 /root/.ansible/tmp/ansible-tmp-1587713210.496898-92940637298090/AnsiballZ_setup.py && sleep 0'
ok: [localhost]
META: ran handlers

TASK [print users] ***********************
task path: /ansible-dev/swap/playbook.yaml:18
fatal: [localhost]: FAILED! => {}

MSG:

You need to install "jmespath" prior to running json_query filter

PLAY RECAP **********************

Ansible установка:

bash-4.2# ansible --version
ansible 2.9.6
  config file = /ansible-dev/swap/ansible.cfg
  configured module search path = ['/ansible-dev/swap/library']
  ansible python module location = /usr/local/lib/python3.7/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.7.6 (default, Feb 26 2020, 20:54:15) [GCC 7.3.1 20180712 (Red Hat 7.3.1-6)]

Проблема возникает, даже если я активирую virtualenv . /usr/local/kaas_virtualenv/bin/activate и запускаю ansible -playbook ansible-playbook -i server_inventory playbook.yaml -vvvv

Запуск playbook с активированным virtualenv:

(kaas_virtualenv) bash-4.2# ansible-playbook -i server_inventory playbook.yaml -vvvv
ansible-playbook 2.9.6
  config file = /ansible-dev/swap/ansible.cfg
  configured module search path = ['/ansible-dev/swap/library']
  ansible python module location = /usr/local/lib/python3.7/site-packages/ansible
  executable location = /usr/local/bin/ansible-playbook
  python version = 3.7.6 (default, Feb 26 2020, 20:54:15) [GCC 7.3.1 20180712 (Red Hat 7.3.1-6)]
Using /ansible-dev/swap/ansible.cfg as config file
setting up inventory plugins
host_list declined parsing /ansible-dev/swap/server_inventory as it did not pass its verify_file() method
script declined parsing /ansible-dev/swap/server_inventory as it did not pass its verify_file() method
auto declined parsing /ansible-dev/swap/server_inventory as it did not pass its verify_file() method
Set default localhost to localhost
Parsed /ansible-dev/swap/server_inventory inventory source with ini plugin
Loading callback plugin debug of type stdout, v2.0 from /usr/local/lib/python3.7/site-packages/ansible/plugins/callback/debug.py

PLAYBOOK: playbook.yaml ***********************
Positional arguments: playbook.yaml
verbosity: 4
connection: smart
timeout: 10
become_method: sudo
tags: ('all',)
inventory: ('/ansible-dev/swap/server_inventory',)
forks: 5
1 plays in playbook.yaml

PLAY [control_host] ***********************

TASK [Gathering Facts] ***********************
task path: /ansible-dev/swap/playbook.yaml:2
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root
<localhost> EXEC /bin/sh -c 'echo ~root && sleep 0'
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo /root/.ansible/tmp/ansible-tmp-1587716569.74761-59629609450822 `" && echo ansible-tmp-1587716569.74761-59629609450822="` echo /root/.ansible/tmp/ansible-tmp-1587716569.74761-59629609450822 `" ) && sleep 0'
Using module file /usr/local/lib/python3.7/site-packages/ansible/modules/system/setup.py
<localhost> PUT /root/.ansible/tmp/ansible-local-4319jytc92b2/tmpwbji1240 TO /root/.ansible/tmp/ansible-tmp-1587716569.74761-59629609450822/AnsiballZ_setup.py
<localhost> EXEC /bin/sh -c 'chmod u+x /root/.ansible/tmp/ansible-tmp-1587716569.74761-59629609450822/ /root/.ansible/tmp/ansible-tmp-1587716569.74761-59629609450822/AnsiballZ_setup.py && sleep 0'
<localhost> EXEC /bin/sh -c 'PYTHONPATH=/usr/local/kaas_virtualenv/lib/python3.7/site-packages /usr/local/kaas_virtualenv/bin/python3 /root/.ansible/tmp/ansible-tmp-1587716569.74761-59629609450822/AnsiballZ_setup.py && sleep 0'
ok: [localhost]
META: ran handlers

TASK [print users] ***********************
task path: /ansible-dev/swap/playbook.yaml:18
fatal: [localhost]: FAILED! => {}

MSG:

You need to install "jmespath" prior to running json_query filter

PLAY RECAP ***********************
localhost                  : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

Проверка модуля pythom с помощью virtualenv Activated :

(kaas_virtualenv) bash-4.2# python -c "import jmespath"
(kaas_virtualenv) bash-4.2#

Проверка модуля pythom с помощью virtualenv деактивировано :

bash-4.2# python -c "import jmespath"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named jmespath
bash-4.2# 

Единственное место, где существует python модуль:

bash-4.2# find / -name jmespath
/usr/local/kaas_virtualenv/lib/python3.7/site-packages/jmespath
bash-4.2#

1 Ответ

0 голосов
/ 28 апреля 2020

Ansible плагины фильтра не используют ansible_python_interpreter. Плагины фильтров должны следовать за установкой Ansible и иметь свои зависимости, где установлены Ansible.

Фильтры ВСЕГДА запускаются на контроллере, так как шаблоны работают ТОЛЬКО на контроллере, в противном случае потребуется jinja2 + прохождение всего инвентаря + все переменные для удаленного, что мы не делаем по многим причинам.

https://github.com/ansible/ansible/issues/69148

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