如何用JMESPath表达式筛选Ansible hostvars中指定文件存在的主机名列表?
使用JMESPath筛选Ansible hostvars中满足文件存在条件的主机名列表
当然可以搞定这个需求!针对你提供的hostvars结构,我们可以用JMESPath表达式直接提取出所有fileexists.stat.exists为true的主机名,具体步骤和表达式如下:
核心JMESPath表达式
to_entries | [?value.fileexists.stat.exists == `true`] | [].key
表达式拆解(一步步看逻辑)
to_entries: 把hostvars这个键值对格式的对象转换成条目数组,每个条目都会变成{"key": "主机名", "value": "该主机的所有变量内容"}的结构,这样我们就能对每个主机的属性做过滤了。[?value.fileexists.stat.exists ==true]: 这一步是过滤条件,只保留那些value(也就是主机变量)里fileexists.stat.exists等于true的条目。注意这里的true要用反引号包裹,因为JMESPath里布尔值是原生类型。[].key: 最后一步是提取所有符合条件条目中的key字段,也就是我们要的主机名,最终输出一个数组。
在Ansible中的使用示例
如果你要在Playbook里用这个表达式,可以结合json_query过滤器,比如用debug模块输出结果:
- name: 输出存在指定文件的主机列表 debug: msg: "{{ hostvars | json_query('to_entries | [?value.fileexists.stat.exists == `true`] | [].key') }}"
验证结果
运行后得到的结果完全符合你的期望:
["oclab1n02.example.org", "oclab1n03.example.org"]
内容的提问来源于stack exchange,提问作者Ilmar Kerm
相关产品推荐
相关产品推荐

