Ansible/YAML中查找JSON输出内字符串并获取对应vrfId方法
错误原因
你遇到的YAML语法报错核心原因是when条件的写法不符合Ansible规则:
- Ansible的
when语句本身处于Jinja2表达式上下文,不需要给里面的变量包裹{{ }}标记,额外嵌套模板标记会导致YAML解析器无法正确识别键值结构,直接抛出"did not find expected key"错误。 - 原写法
"{{ tenant }}" in "{{ item.name }}"即使绕过语法校验,也属于不规范的模板嵌套写法,容易因渲染后的字符串格式问题出现匹配逻辑错误。
正确实现
调试遍历任务写法
修正后的调试任务代码如下,新版Ansible推荐用loop替代旧版with_items,当然保留with_items只要条件写法正确也可正常运行:
- name: 输出匹配租户编码的VRF条目 debug: msg: "{{ item }}" loop: "{{ vrf.json.data }}" when: tenant in item.name
当tenant变量值为XYZ时,该任务只会输出name字段包含XYZ的vrfId:2对应的条目。
提取vrfId并保存的最优写法
不需要手动循环判断,直接用Ansible内置过滤器即可一次性完成筛选、字段提取、赋值,执行效率更高:
- name: 提取匹配指定编码的VRF ID并保存 set_fact: matched_vrf_id: "{{ vrf.json.data | selectattr('name', 'search', tenant) | map(attribute='vrfId') | first | default('') }}"
参数说明:
selectattr('name', 'search', tenant):筛选所有name字段包含tenant变量值的列表项,search支持子串正则匹配,稳定性高于直接写in判断map(attribute='vrfId'):从筛选后的结果中提取所有vrfId字段值first:取第一个匹配到的vrfId值default(''):当没有匹配到任何条目时返回空字符串,避免因取空值触发运行错误
如果需要同时匹配多个3位编码(比如ABC/KLM/XYZ),只需要把tenant定义为编码列表,调整筛选规则即可:
- name: 提取匹配多租户编码的VRF ID列表 set_fact: matched_vrf_ids: "{{ vrf.json.data | selectattr('name', 'search', tenant_list | join('|')) | map(attribute='vrfId') | list }}" vars: tenant_list: ['ABC', 'KLM', 'XYZ']
内容的提问来源于stack exchange,提问作者E.J. Kok
相关产品推荐
相关产品推荐

