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

nor*_*ori 3 python pip ansible ansible-playbook

我在 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"}
Run Code Online (Sandbox Code Playgroud)

但 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
Run Code Online (Sandbox Code Playgroud)

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') }}"
Run Code Online (Sandbox Code Playgroud)

我缺少什么?

nor*_*ori 7

我能够弄清楚。

# 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
Run Code Online (Sandbox Code Playgroud)

解释:

本系统安装了两个版本的python3:

  • python3.6
  • python3.8

python3.6 似乎是该系统上 Python 的默认版本:

# python3 --version
Python 3.6.8

# which python3.8
/bin/python3.8
Run Code Online (Sandbox Code Playgroud)

看起来:

  • Ansible 使用的是非默认版本 python3.8
  • jmespath两个版本需要分别安装该模块。

运行上述pip3.8命令后,错误消失。