Ansible:“您需要在运行 json_query 过滤器之前安装‘jmespath’”,但它已安装

Ansible:“您需要在运行 json_query 过滤器之前安装‘jmespath’”,但它已安装

我在 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.13.3 依赖项

Ansible-core 2.14 依赖于 python 3.11,但至少在 AlmaLinux 8.7 上没有安装 pip。

ansible-core 2.14 依赖项

在 AlmaLinux 8.7 上没有 python3.11-pip RPM,同样的情况可能适用于 RHEL8.7 和 RockyLinux 8.7。

但在8.8 版本 pip 再次出现

如果您的构建依赖于 AlmaLinux8,您的(提供商的)软件包存储库可能有,也可能没有安装 pip 所需的 RPM。您是否可以访问 Pypi 也取决于您的情况。

请注意,pip3指向platform-pythonRHEL8,即 Python3.6,这对于模块所需的 python 库来说没问题,但对于 jmespath 来说就不行了。你最好更明确一点!

如果你运行ansible-core2.14,python3.11那么你可以jmespath使用以下命令安装:

/usr/bin/pip3.11 install jmespath

如果您运行ansible-core2.12,python3.9那么您可以使用以下命令安装“jmespath:

/usr/bin/pip3.9 install jmespath

结论 如今,电池似乎太重了,无法包含,该json_query插件不是 ansible-core 的一部分,但包含在集合中,它依赖于您需要在控制器上安装的community.general外部库。您可能由于各种原因无法成功。可能还有其他方法可以在控制器上对 JSON 返回值进行后处理,例如程序。jmespathpython3 -m pip install jmespathjq

https://github.com/ansible/ansible/blob/56f2e65ee78bd0031775e986ff45501b590d9dc1/docs/docsite/rst/playbook_guide/playbooks_filters.rst#selecting-json-data-json-queries

答案3

Ansible 任务在远程服务器上执行。您需要确保所需的模块已安装在那里。

答案4

我将我的虚拟环境与笔记本电脑的 python/pip 二进制文件混淆了,我为笔记本电脑上可用的每个 python 版本安装了此模块(python3.8 / 3.9 / 3.10)

然后过了一会儿我注意到,我在 virtualenv 目录中使用 Ansible,因此 - 我需要从本地 pip 安装:venv/bin/pip3 install jmespath...

相关内容