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

Ansible解析Juniper交换机JSON获取ae0对应LLDP远程系统名报错

Ansible筛选Juniper LLDP数据json_query报错修复

报错根因

报错 模板字符串渲染错误:期望令牌',',实际获取到'ae0' 是因为json_query使用的JMESPath语法中,你要匹配的字符串值ae0没有做正确的常量包裹,解析器将ae0识别成了字段标识符而非匹配值,触发语法解析失败。
绝大多数场景下是筛选表达式直接写了[?lldp_local_parent_interface_name==ae0]这类格式,没有给ae0加字符串标记,同时Ansible的Jinja2模板渲染和JMESPath的引号规则存在转义冲突,直接套单/双引号很容易出现渲染层级错误。

修复方案

优先使用变量传值+JMESPath反引号包裹常量的写法,完全规避转义问题,参考任务代码:

# 第一步:加载本地存储的JSON数据
- name: 加载Juniper LLDP原始数据
  ansible.builtin.include_vars:
    file: juniper-data.json
    name: juniper_raw_data

# 第二步:筛选ae0对应的远端主机名
- name: 提取目标远端设备名
  ansible.builtin.set_fact:
    target_host: "{{ juniper_raw_data | json_query(query_expr) | first }}"
  vars:
    match_intf: "ae0"
    # 注意:如果JSON数据里lldp邻居列表不是根节点,比如嵌套在lldp_info.neighbors下,要补全前面的层级路径
    query_expr: "[*].lldp_neighbor_list[?lldp_local_parent_interface_name==`{{ match_intf }}`].lldp_remote_system_name"

# 第三步:验证输出
- name: 打印提取结果
  ansible.builtin.debug:
    var: target_host

注意事项

  • 如果执行后返回空值,先通过debug打印juniper_raw_data的完整结构,调整query_expr里的层级路径即可,Juniper不同Ansible模块返回的LLDP数据嵌套层级会有差异,部分版本数据路径为lldp_neighbors[*].interfaces[*]
  • 不要直接在json_query的字符串里硬编码写ae0不带包裹,也不要混用双层双引号,会触发Jinja2提前渲染导致语法错误
  • 表达式末尾加| first是因为筛选结果默认是数组格式,取第一个元素就能直接得到你要的A_B_C_D字符串,不需要额外做列表转字符串处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:39:58