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

如何使用Ansible的json_query筛选指定VLAN的接入端口并适配动态VLAN变量

Ansible json_query 筛选VLAN端口的方法验证与指南

你的所有筛选写法都是正确的!

我来逐个拆解背后的逻辑,帮你彻底搞清楚:

1. 从原始接口数据筛选VLAN30接入端口

- name: "P901T6: Set fact to include only access ports - IOS"
  set_fact:
    access_ports_ios_2: "{{ intf_output_ios | json_query(query) }}"
  vars:
    query: >-
      gathered[?access.vlan==`30`]

这里必须用`30`而非'30'的核心原因是:json_query遵循JMESPath语法,在JMESPath里,数字类型的值不需要加引号,而单引号包裹的'30'会被识别为字符串,和你数据里的整数类型vlan:30匹配失败。反引号在Ansible的变量字符串中起到转义作用,让JMESPath把30识别为原生数字类型,确保匹配成功。

2. 从已筛选的接入端口列表再过滤

- debug:
    var: access_ports_ios|json_query(query)
  vars:
    query: >-
      [?access.vlan==`30`]

这个写法完全没问题,因为此时access_ports_ios本身就是一个列表结构,所以JMESPath可以直接对列表元素进行过滤,不需要再指定上层的gathered键。

3. 使用动态VLAN变量的写法

- name: Debug 4
  debug:
    var: access_ports_ios|json_query('[?access.vlan==`{{ src_vlan | int}}`]')

这个写法非常严谨:先用| int过滤器把src_vlan变量转换成整数类型,再用反引号包裹,确保JMESPath将其识别为数字,和数据里的整数vlan字段精准匹配,避免了字符串与整数类型不匹配导致的筛选失败问题。


深入理解Ansible中json_query的核心要点

  • JMESPath是基础:json_query本质是调用JMESPath库,所有语法规则都遵循JMESPath标准:
    • 数字直接写,字符串必须用单引号包裹(比如筛选接口名称要写[?name=='GigabitEthernet0/3'])
    • 嵌套字段用.访问,比如access.vlan就是访问元素内access字典下的vlan键
    • 比较运算符(==/!=/</>等)要求两边类型完全匹配,这是最容易踩坑的点
  • Ansible变量传递技巧:
    • 传入JMESPath的变量必须确保类型正确,必要时用| int/| string等过滤器转换
    • 反引号的作用是让Ansible渲染后的变量直接作为JMESPath的原生类型(比如整数),而非字符串
  • 常见避坑指南:
    • 如果某些元素没有目标嵌套字段(比如你的数据里很多接口没有access键),JMESPath会自动忽略这些元素,不会抛出错误
    • 当不确定字段类型时,可以先用debug模块打印原始数据,确认字段是整数还是字符串

进阶学习资源

  • Ansible官方文档:重点查看playbooks_filters章节中json_query的JMESPath表达式示例和类型匹配说明
  • JMESPath官方文档:优先学习过滤表达式、类型字面量(数字/字符串/布尔值的写法)和变量插值相关内容
  • Ansible社区示例:可以在官方示例Playbook或Galaxy角色中查找json_query的实际应用场景,比如网络设备配置筛选、云资源清单过滤等

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:12:38