如何从含空格键的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
相关产品推荐
相关产品推荐

