为何结合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
相关产品推荐
相关产品推荐

