[英]Ansible using python3 virtualenv not working with python3 site-packages
如何復制問題:
/usr/bin/python3 -m pip install ansible
python3 -m venv /usr/local/kaas_virtualenv
/usr/local/kaas_virtualenv/bin/python3 -m pip install jmespath
Ansible 劇本和庫存:
劇本.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
運行劇本: ansible-playbook -i server_inventory playbook.yaml
預期 output:
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
實際 output:
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
. /usr/local/kaas_virtualenv/bin/activate
並運行 ansible-playbook ansible-playbook -i server_inventory playbook.yaml -vvvv
在激活 virtualenv 的情況下運行 playbook:
(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
使用 virtualenv激活檢查 pythom 模塊:
(kaas_virtualenv) bash-4.2# python -c "import jmespath"
(kaas_virtualenv) bash-4.2#
使用 virtualenv deactivated檢查 pythom 模塊:
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#
Ansible 過濾器插件未使用ansible_python_interpreter
。 過濾器插件必須遵循 Ansible 安裝,並且在安裝 Ansible 的位置具有其依賴項。
過濾器總是在 controller 上運行,因為模板只發生在 controller 上,否則它將需要 jinja2 + 將所有庫存都傳遞給遠程,因為許多原因我們不使用變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.