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

为何结合range()使用JMS表达式在Ansible中无法生效?

问题:Ansible中zip生成tuple导致json_query失效的解决办法

需要过滤如下结构的嵌套数组:

[
  [0, {…}],
  [1, {…}],
  …
]

JMS路径表达式[?@[0] > 0]在纯列表场景下可正常工作,比如:

- debug: msg="{{ [[1],[2],[3],[4]] | community.general.json_query('[?@[0] > `1`]') }}"

但结合range()与zip()使用时,该表达式返回空列表[]:

- debug: msg="{{ range(0,3) | zip(range(3,0,-1)) | community.general.json_query('[?@[0] > `1`]') }}"

排查发现,zip()生成的是tuple类型(非JSON兼容数据类型),而json_query依赖JSON标准类型(列表、字典等),因此无法识别tuple的索引操作。


解决办法

方法1:使用map('list')过滤器转换

通过map('list')遍历zip的结果,将每个tuple转换为列表,再传入json_query:

- debug: 
    msg: "{{ range(0,3) | zip(range(3,0,-1)) | map('list') | community.general.json_query('[?@[0] > `1`]') }}"

方法2:使用Jinja列表推导式转换

通过列表推导逐个处理zip生成的tuple,转换为列表后再过滤:

- debug: 
    msg: "{{ [item | list for item in range(0,3) | zip(range(3,0,-1))] | community.general.json_query('[?@[0] > `1`]') }}"

验证转换结果:执行以下debug可以看到zip的结果被转为纯列表结构,此时json_query就能正常过滤出符合条件的元素:

- debug: 
    msg: "{{ range(0,3) | zip(range(3,0,-1)) | map('list') }}"

输出为:[[0, 3], [1, 2], [2, 1]],对应的过滤结果为[[2, 1]]。

内容的提问来源于stack exchange,提问作者philipp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 09:40:00