如何统计Ansible vmware_cluster_info返回JSON中集群的主机数量
解决方法
你可以用以下两种无报错的方案实现统计,适配动态集群名的场景:
方案1:使用Jinja2原生过滤器(无额外依赖)
不需要安装任何额外组件,直接用Ansible自带的过滤器处理嵌套字典结构:
# 统计所有集群的总主机数量 - debug: msg: "集群总主机数:{{ cluster_info.clusters | dict2items | map(attribute='value.hosts') | flatten | length }}" # 如果需要逐个输出每个动态集群的主机数,用循环实现 - debug: msg: "集群{{ item.key }}主机数为:{{ item.value.hosts | length }}" loop: "{{ cluster_info.clusters | dict2items }}"
方案2:使用json_query过滤器(适配复杂查询场景)
需要先在Ansible控制节点安装jmespath依赖(执行pip install jmespath),再用jmespath语法查询:
- debug: msg: "集群总主机数:{{ cluster_info | json_query('clusters.*.hosts[]') | length }}"
报错原因说明
你之前的两种写法报错的核心原因:
cluster_info.clusters.[].hosts.name写法不符合Jinja2语法规范,[]不是合法的字典取值通配符cluster_info.clusters.*.hosts.name里的*通配符只有jmespath语法支持,不能直接在普通Jinja2变量取值中使用
学习建议
针对JSON解析类的需求,可以按以下路径学习降低难度:
- 先掌握Jinja2常用过滤器:优先练
dict2items、map、flatten、selectattr这几个处理嵌套结构高频使用的过滤器,对着Ansible官方文档的内置过滤器示例多写几次调试,很快就能上手。 - 有复杂查询需求再学json_query对应的jmespath基础语法,只需要掌握通配、属性选择、简单过滤三个核心逻辑就能覆盖90%的运维场景,不用学太深入的高阶语法。
- 调试长表达式的时候拆成多步debug打印中间结果,比如先打印
cluster_info.clusters | dict2items的输出,确认结构符合预期后再逐步追加后面的过滤器,出错更容易定位。
内容的提问来源于stack exchange,提问作者Julia L
相关产品推荐
相关产品推荐

