You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Ansible json_query筛选RHEL7升级后遗留的el7包?

找出RHEL原地升级后遗留的RHEL7包的Ansible JSON Query写法

我们正在执行RHEL 7到RHEL 8的原地升级,升级完成后发现并非所有RHEL 7的包都被移除,需要通过Ansible的package_facts模块结合json_query筛选出主机上所有含el7标记的遗留包。

示例package_facts数据

{
  "ansible_facts.packages": {
    "zlib": [
      {
        "arch": "x86_64",
        "epoch": null,
        "release": "11.el7",
        "source": "rpm",
        "version": "1.2.7"
      },
      {
        "arch": "x86_64",
        "epoch": null,
        "release": "10.el7",
        "source": "rpm",
        "version": "1.2.6"
      },
      {
        "arch": "x86_64",
        "epoch": null,
        "release": "10.el8",
        "source": "rpm",
        "version": "1.2.7"
      }
    ]
  }
}

问题分析

你之前尝试的[?contains(release, 'el7')]和[?release == '*el7*']无法直接生效,因为ansible_facts.packages是字典结构(包名作为key,对应的版本列表作为value),而非数组,需要先将字典的值展开为数组再进行筛选。

正确的JSON Query语句

使用以下查询语句可遍历所有包的版本列表,筛选出release字段包含el7的包信息:

"*.[] | [?contains(release, 'el7')]"
  • *.[]:将字典中所有value(即每个包的版本列表)展开为扁平数组
  • |:管道符,将前一步结果传递给后续筛选逻辑
  • [?contains(release, 'el7')]:筛选出release字段包含el7的条目

完整Ansible Playbook示例

- name: 收集并筛选遗留的RHEL7包
  hosts: all
  gather_facts: false
  tasks:
    - name: 收集系统包信息
      ansible.builtin.package_facts:
        manager: auto

    - name: 筛选含el7标记的遗留包
      ansible.builtin.set_fact:
        rhel7_legacy_packages: "{{ ansible_facts.packages | json_query('*.[] | [?contains(release, `el7`)]') }}"

    - name: 输出遗留包列表
      ansible.builtin.debug:
        var: rhel7_legacy_packages

补充:保留包名与版本的映射关系

如果需要保留包名和对应遗留版本的映射,可使用以下查询语句:

"@ | map_values([?contains(release, 'el7')]) | reject('empty')"

该语句会返回一个字典,key为包名,value为该包下所有含el7的版本列表,同时自动过滤掉无遗留版本的包。

内容的提问来源于stack exchange,提问作者Zack McCain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 11:57:48