如何使用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的原生类型(比如整数),而非字符串
- 传入JMESPath的变量必须确保类型正确,必要时用
- 常见避坑指南:
- 如果某些元素没有目标嵌套字段(比如你的数据里很多接口没有
access键),JMESPath会自动忽略这些元素,不会抛出错误 - 当不确定字段类型时,可以先用
debug模块打印原始数据,确认字段是整数还是字符串
- 如果某些元素没有目标嵌套字段(比如你的数据里很多接口没有
进阶学习资源
- Ansible官方文档:重点查看
playbooks_filters章节中json_query的JMESPath表达式示例和类型匹配说明 - JMESPath官方文档:优先学习过滤表达式、类型字面量(数字/字符串/布尔值的写法)和变量插值相关内容
- Ansible社区示例:可以在官方示例Playbook或Galaxy角色中查找
json_query的实际应用场景,比如网络设备配置筛选、云资源清单过滤等
内容的提问来源于stack exchange,提问作者user5916060
相关产品推荐
相关产品推荐

