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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:36:24