使用Ansible遍历JSON数据并检查数组中是否存在指定字符串
实现方案
这里分两种常用实现方式,你可以根据自己的需求选择:
方案1:使用Jinja2过滤器直接判断(推荐,无需循环)
直接通过映射过滤器提取所有颜色字段做存在性判断,逻辑简洁性能更高,没有循环开销:
vars: color: "red" - name: 拉取JSON数据 uri: url: example.com/json_data register: color_data - name: 校验指定颜色是否存在 fail: msg: "颜色 '{{ color }}' 未找到" when: color not in (color_data.json.datasource | map(attribute='color') | list)
方案2:循环查找匹配后终止
如果需要在匹配到目标的同时做额外操作,可以用循环+break逻辑实现找到就终止:
vars: color: "red" - name: 拉取JSON数据 uri: url: example.com/json_data register: color_data - name: 初始化颜色匹配标记 set_fact: color_found: false - name: 遍历查找目标颜色 set_fact: color_found: true # 这里可以追加其他匹配后要执行的赋值逻辑,比如取对应value: color_value: item.value loop: "{{ color_data.json.datasource }}" when: item.color == color loop_control: break_when: color_found # 匹配到后直接终止循环,不再遍历后续元素 - name: 未匹配到颜色时报错 fail: msg: "颜色 '{{ color }}' 未找到" when: not color_found
原代码的问题说明
- 逻辑判断写反:原有判断是只要当前遍历项不匹配就直接报错,会导致还没遍历完所有元素就提前失败
- 数据路径错误:
uri模块返回的JSON响应默认存储在注册变量的json属性下,需要用color_data.json.datasource取数组 - 语法错误:fail的msg字符串引号没有闭合
内容的提问来源于stack exchange,提问作者Pfarc
相关产品推荐
相关产品推荐

