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

如何从含空格键的JSON数组设置Ansible Fact并筛选指定VDOM

解决Ansible中处理带空格键名并筛选特定VDOM的Fact设置问题

看起来你遇到了两个核心问题:一是JSON键名包含空格时的正确引用方式,二是如何精准筛选出vdom为vdom-shop的条目并提取对应的name值。我来帮你一步步搞定:

问题分析

你的现有Playbook只是把每个result.results项中的scope member数组赋值给了app_item,但缺少关键的筛选逻辑——你需要从scope member数组里找出vdom等于vdom-shop的元素,再提取它的name作为最终的Fact。另外,带空格的键名在Ansible中用方括号语法(item['scope member'])引用是正确的,这部分你没出错,只是需要补充过滤步骤。

解决方案1:用json_query一次性筛选提取(推荐)

json_query是处理复杂JSON结构的高效工具,能一次性完成遍历、筛选和提取操作,代码更简洁:

- name: Extract target device name using json_query
  set_fact:
    target_device_name: "{{ result.results | json_query('[*].\"scope member\"[?vdom==`vdom-shop`].name | [0][0]') }}"

代码解释:

  • [*].\"scope member\":遍历result.results中的每一项,取出带空格的scope member数组
  • [?vdom==vdom-shop]:筛选出vdom字段等于vdom-shop的元素
  • .name:提取这些元素的name值
  • | [0][0]:因为结果会是嵌套数组(外层是results遍历结果,内层是scope member筛选结果),取第一个非空的匹配值(对应你示例中的IN-FG-04)

解决方案2:用loop+subelements遍历筛选

如果你更偏好显式的循环逻辑,可以用subelements插件展开嵌套数组,再通过when条件过滤:

- name: Iterate through results and filter by vdom
  set_fact:
    target_device_name: "{{ scope_member.name }}"
  loop: "{{ result.results | subelements('scope member') }}"
  vars:
    scope_member: "{{ item.1 }}"
  when: scope_member.vdom == "vdom-shop"

代码解释:

  • subelements('scope member'):将result.results中的每一项和它的scope member数组展开成成对元素(item.0是results中的项,item.1是对应的scope member元素)
  • vars定义scope_member简化后续引用
  • when条件只匹配vdom为vdom-shop的元素,此时将对应的name设为Fact

验证结果

执行完上述任务后,你可以用debug模块查看最终结果:

- name: Show the target device name
  debug:
    var: target_device_name

它会输出你需要的IN-FG-04。

内容的提问来源于stack exchange,提问作者athi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:40:50