如何用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
相关产品推荐
相关产品推荐

