我在 Python3 和 Enterprise Linux 8 (Rocky Linux 8) 上使用 Ansible。
当我尝试使用时json_query
,出现以下错误:
fatal: [ansible]: FAILED! => {"msg": "You need to install \"jmespath\" prior to running json_query filter"}
但 Python 模块似乎已经安装好了:
# dnf install python3-jmespath
Last metadata expiration check: 1:44:38 ago on Mi 02 Nov 2022 12:54:28 CET.
Package python3-jmespath-0.9.0-11.el8.noarch is already installed.
Dependencies resolved.
Nothing to do.
Complete!
# pip3 install jmespath
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Requirement already satisfied: jmespath in /usr/lib/python3.6/site-packages
我jmespath
在交互式 Python 解释器中进行了测试,它运行正常,没有错误。这似乎证实了 Python 模块已安装并正常工作。
看来该问题仅在使用 Ansible 时才会发生。
这是我用于测试的剧本:
---
- name: test json_query
hosts: ansible
vars:
data:
list1:
one:
name: "hello"
two:
name: "world"
tasks:
- name: search variable
ansible.builtin.debug:
var: item
loop: "{{ data | community.general.json_query('list1[*].name') }}"
我错过了什么?
答案1
我能够弄清楚。
# pip3.8 install jmespath
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3.8 install --user` instead.
Collecting jmespath
Installing collected packages: jmespath
Successfully installed jmespath-1.0.1
解释:
本系统安装了两个版本的python3:
- python3.6
- python3.8
python3.6 似乎是该系统上的 Python 默认版本:
# python3 --version
Python 3.6.8
# which python3.8
/bin/python3.8
看起来:
- Ansible 使用非默认版本 python3.8
jmespath
两个版本都需要分别安装该模块。
运行上述pip3.8
命令后,错误消失。
答案2
Ansible 任务是传输到远程服务器并执行的操作,它们ansible_python_interpreter
被发现,并且很可能是“platform-python”(RHEL8 上的 python3.6)。如果模块需要,您需要确保所需的模块已安装在那里(检查 ansible-doc)。
但是 Ansible 回调过滤器(例如json_query
)在 Ansible 控制节点上运行。即使您使用 ansible 管理同一台机器,也可能使用另一个版本的 Ansible。
在控制器上,您可能使用名为ansible
或 的包ansible-core
,或者您可能已在 python3 venv 中安装了 ansible。无论如何,jmespath
都应安装在与在控制器上运行剧本相同的 python 版本中。
软件包中最近的变化ansible-core
使这种依赖关系变得复杂:
Ansible-core 2.13 依赖于 python 3.9,它将 pip 安装为弱依赖项:
Ansible-core 2.14 依赖于 python 3.11,但至少在 AlmaLinux 8.7 上没有安装 pip。
在 AlmaLinux 8.7 上没有 python3.11-pip RPM,同样的情况可能适用于 RHEL8.7 和 RockyLinux 8.7。
如果您的构建依赖于 AlmaLinux8,您的(提供商的)软件包存储库可能有,也可能没有安装 pip 所需的 RPM。您是否可以访问 Pypi 也取决于您的情况。
请注意,pip3
指向platform-python
RHEL8,即 Python3.6,这对于模块所需的 python 库来说没问题,但对于 jmespath 来说就不行了。你最好更明确一点!
如果你运行ansible-core
2.14,python3.11
那么你可以jmespath
使用以下命令安装:
/usr/bin/pip3.11 install jmespath
如果您运行ansible-core
2.12,python3.9
那么您可以使用以下命令安装“jmespath:
/usr/bin/pip3.9 install jmespath
结论
如今,电池似乎太重了,无法包含,该json_query
插件不是 ansible-core 的一部分,但包含在集合中,它依赖于您需要在控制器上安装的community.general
外部库。您可能由于各种原因无法成功。可能还有其他方法可以在控制器上对 JSON 返回值进行后处理,例如程序。jmespath
python3 -m pip install jmespath
jq
答案3
Ansible 任务在远程服务器上执行。您需要确保所需的模块已安装在那里。
答案4
我将我的虚拟环境与笔记本电脑的 python/pip 二进制文件混淆了,我为笔记本电脑上可用的每个 python 版本安装了此模块(python3.8 / 3.9 / 3.10)
然后过了一会儿我注意到,我在 virtualenv 目录中使用 Ansible,因此 - 我需要从本地 pip 安装:venv/bin/pip3 install jmespath
...