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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:33:50