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)
问题原因
- XML格式兼容性问题:IOS XE 17.x对NetConf的XML格式校验更严格,手动拼接的XML字符串可能存在多余换行、空格或格式不符合规范的情况,导致设备无法识别过滤器元素。
- ncclient参数传递错误:
edit_config方法未明确指定config参数名,IOS XE 17.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
相关产品推荐
相关产品推荐

