Ansible使用json_query过滤器无法匹配id_old获取对应id_new的问题
问题原因
你的写法存在两个核心错误:
- 筛选对象类型不匹配:对
old_new_nodes调用first过滤器后得到的是单个字典对象,而你写的[?id_old==xxx]是JMESPath的数组筛选语法,只能作用于数组类型变量,自然无法返回结果。 - 变量未正确注入:
json_query的查询字符串默认不会自动解析Ansible变量,直接写original_node.id会被JMESPath识别为常量字符串,而不是你提前定义的变量值2263,匹配条件永远不成立。
修复方案
直接对old_new_nodes数组做查询,正确注入变量值即可,示例如下:
- name: Get id of the new node set_fact: new_node_id: "{{ old_new_nodes | json_query('[?id_old==`' ~ original_node.id ~ '`].id_new') | first }}"
语法说明
- 去掉
first过滤器,直接把完整的old_new_nodes数组传给json_query做全量匹配 - 用Ansible字符串拼接符
~将original_node.id的实际值注入到查询语句中,数值类型的匹配值需要用反引号`包裹,符合JMESPath语法规范。如果你的id_old是字符串类型,将反引号替换为单引号即可 - 最后追加的
first过滤器用于提取json_query返回结果数组中的第一个匹配值,最终得到单个id值而非数组
执行上述任务后,new_node_id会得到你预期的2430。
内容的提问来源于stack exchange,提问作者Hector Esteban
相关产品推荐
相关产品推荐

