Ansible如何从键名不固定(后缀为Diff)的JSON中提取path值
实现方案
你可以通过Jinja2自带的字典处理过滤器,筛选出以Diff为后缀的动态键,两种常用的实现方式如下:
方式一:原生Jinja2过滤器实现(无额外依赖)
直接修改你的debug任务代码即可:
- name: 提取Diff节点下的path字段值 debug: msg: >- {% set trace_root = atc_AS3_status.msg.json.traces.values() | first %} {% set diff_node = trace_root | dict2items | selectattr('key', 'search', 'Diff$') | map(attribute='value') | first %} {{ diff_node | map(attribute='path') | list }}
如果traces下可能存在多个xxxCurrent类的根键,把代码中的first替换为循环遍历逻辑即可适配。
方式二:json_query实现(需要提前安装jmespath依赖)
如果你的Ansible运行环境已经安装了jmespath库,可以用更简洁的查询语法:
- name: 通过json_query提取path值 debug: msg: "{{ atc_AS3_status.msg.json.traces | json_query('*.*[?ends_with(key, `Diff`)].value[] | [].path') }}"
逻辑说明
- 两种方案都通过匹配
Diff$后缀定位动态键,不受前缀变化的影响 - 最终输出为所有匹配到的Diff节点下的path字段值列表,兼容单个/多个Diff节点的场景
内容的提问来源于stack exchange,提问作者sundrys1
相关产品推荐
相关产品推荐

