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
相关产品推荐
相关产品推荐

