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

Cisco IOS XE 17.3使用ncclient过滤器触发RPC错误求助

Cisco IOS XE 17.3 NetConf过滤器报错问题排查

问题背景

在Cisco IOS XE 17.3版本的路由器上使用NetConf时,执行get_config、get或edit_config命令添加过滤器后会触发报错;不使用过滤器时,get_config可正常运行。相同代码在IOS XE 16.9.3版本上无异常。

错误信息

ncclient.operations.rpc.RPCError: {'type': 'protocol', 'tag': 'unknown-element', 'app_tag': None, 'severity': 'error', 'info': 'filter\n\n', 'path': '\n /rpc/get-config\n ', 'message': None}

相关代码示例

get_config代码

router = manager.connect(
    host="sandbox-iosxe-latest-1.cisco.com",
    port=830,
    username="admin",
    password="C1sco12345",
    hostkey_verify=False
)

filter2 = """
<filter>
    <native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native" />
    
</filter>
"""

netconf = router.get_config(source="running", filter=filter2)

edit_config代码(修改主机名)

netconfnewhostname = """
<config>
  <native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">
     <hostname>DangledwasHere</hostname>
  </native>
</config>
"""

netconf_reply = router.edit_config(netconfnewhostname, target="running")
print(xml.dom.minidom.parseString(netconf_reply.xml).toprettyxml())

get命令代码

netconf_filterinterface = """
<filter>
  <interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces"/>
</filter>
"""
netconfinterfaces = router.get(filter=netconf_filterinterface)

问题原因

  1. XML格式兼容性问题:IOS XE 17.x对NetConf的XML格式校验更严格,手动拼接的XML字符串可能存在多余换行、空格或格式不符合规范的情况,导致设备无法识别过滤器元素。
  2. ncclient参数传递错误:edit_config方法未明确指定config参数名,IOS XE 17.3对参数传递的规范性要求更高,模糊的参数传递会触发报错。
  3. YANG模块加载问题:部分YANG模块在IOS XE 17.3中默认未加载,导致过滤器引用的模块无法被设备识别。

解决方法

1. 规范过滤器传递方式

避免直接传递手动拼接的XML字符串,改用ncclient提供的工具类构造过滤器:

方法一:使用SubtreeFilter

from ncclient.xml_ import to_ele, SubtreeFilter

# 构造get_config的过滤器
filter_subtree = SubtreeFilter(to_ele('<native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native" />'))
netconf = router.get_config(source="running", filter=filter_subtree)

# 构造get命令的过滤器
interface_filter = SubtreeFilter(to_ele('<interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces"/>'))
netconfinterfaces = router.get(filter=interface_filter)

方法二:将XML字符串转换为Element对象

from ncclient.xml_ import to_ele

filter2 = to_ele('<filter><native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native" /></filter>')
netconf = router.get_config(source="running", filter=filter2)

2. 修正edit_config参数传递

明确指定config参数名,确保参数传递符合ncclient规范:

netconf_reply = router.edit_config(config=netconfnewhostname, target="running")

3. 验证并加载YANG模块

在路由器上执行以下命令检查模块状态:

show netconf yang modules

如果目标模块(如Cisco-IOS-XE-native、ietf-interfaces)未加载,执行加载命令:

netconf-yang module load Cisco-IOS-XE-native
netconf-yang module load ietf-interfaces

验证测试

修改代码后重新运行,检查是否能正常获取过滤后的配置或完成设备配置编辑操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:17:36