如何在Ansible中用JMESPath统计多字段唯一组合的数量
Ansible 统计makerID与BIOS版本组合的主机数量
方案思路
Ansible的json_query(JMESPath)对分组统计支持有限,更简便的方式是结合Ansible内置的groupby过滤器和循环实现分组计数。核心步骤是先按makerID+bios.vers的组合分组,再统计每组的主机数量。
具体Playbook示例
假设主机facts数据存储在变量host_facts中(可通过setup模块收集,或自定义结构化数据),示例如下:
- name: 统计makerID与BIOS版本的主机数量 hosts: localhost vars: # 模拟主机facts数据,实际替换为真实收集的数据 host_facts: - System: {makerID: "Dell"} bios: {vers: "1.2.3"} - System: {makerID: "Dell"} bios: {vers: "1.2.3"} - System: {makerID: "HP"} bios: {vers: "4.5.6"} - System: {makerID: "Dell"} bios: {vers: "7.8.9"} - System: {makerID: "HP"} bios: {vers: "4.5.6"} - System: {makerID: "Lenovo"} bios: {vers: "10.11.12"} tasks: - name: 按makerID和BIOS版本组合分组 set_fact: grouped_hosts: "{{ host_facts | groupby(['System.makerID', 'bios.vers']) }}" - name: 生成统计结果 set_fact: stats_result: "{{ stats_result | default([]) + [{'makerID': item.0.0, 'version': item.0.1, 'quantity': item.1 | length}] }}" loop: "{{ grouped_hosts }}" - name: 输出统计结果 debug: var: stats_result
结果说明
执行后会输出结构化统计结果,示例如下:
ok: [localhost] => { "stats_result": [ { "makerID": "Dell", "quantity": 2, "version": "1.2.3" }, { "makerID": "Dell", "quantity": 1, "version": "7.8.9" }, { "makerID": "HP", "quantity": 2, "version": "4.5.6" }, { "makerID": "Lenovo", "quantity": 1, "version": "10.11.12" } ] }
补充说明
如果一定要用json_query配合处理,可先提取所有组合,再通过JMESPath的group_by函数分组,但需注意Ansible对JMESPath扩展函数的支持。相比之下,Ansible原生的groupby过滤器更直观、兼容性更好,完全适配动态数据场景。
内容的提问来源于stack exchange,提问作者KDP
相关产品推荐
相关产品推荐

