如何通过中间命令获取CiscoConfParse的完整配置块?
问题描述
通过配置块中的某条命令(如ip address 10.2.2.3/24)获取完整配置块时,发现缩进更深的子项(如ip 10.2.2.1)缺失,示例代码及不完整输出如下:
from ciscoconfparse import CiscoConfParse config = """ hostname switch interface Vlan2 description vlan2 ip address 10.2.2.3/24 hsrp 2 ip 10.2.2.1 interface Vlan3 description vlan3 ip address 10.3.3.3/24 hsrp 3 ip 10.3.3.1 """.splitlines() ccp = CiscoConfParse(config=config) blocks = ccp.find_blocks("10.2.2.3/24") print(blocks) # 输出: ['interface Vlan2', ' description vlan2', ' ip address 10.2.2.3/24', ' hsrp 2']
需要实现优雅的方法,获取包含所有嵌套子项的完整配置块,预期输出:
['interface Vlan2', ' description vlan2', ' ip address 10.2.2.3/24', ' hsrp 2', ' ip 10.2.2.1']
解决方案
ciscoconfparse的find_blocks方法默认仅匹配当前层级及同层级的后续命令,不会递归获取更深缩进的嵌套子配置。正确做法是通过目标行找到所属的父配置块,再递归获取所有子项:
from ciscoconfparse import CiscoConfParse config = """ hostname switch interface Vlan2 description vlan2 ip address 10.2.2.3/24 hsrp 2 ip 10.2.2.1 interface Vlan3 description vlan3 ip address 10.3.3.3/24 hsrp 3 ip 10.3.3.1 """.splitlines() ccp = CiscoConfParse(config=config) # 定位包含目标IP的行对象 target_line_obj = ccp.find_lines("10.2.2.3/24")[0] # 获取该行所属的父接口配置块对象 parent_interface = target_line_obj.parent # 递归获取接口下所有子配置行,包括嵌套层级 full_config_block = [parent_interface.text] + [child.text for child in parent_interface.get_children(recursive=True)] print(full_config_block)
关键说明
find_linesvsfind_blocks:find_lines返回行对象(而非纯文本),可通过parent属性追溯到所属的父配置块;get_children(recursive=True):开启递归后,会获取所有嵌套层级的子配置行,确保不遗漏深层缩进的命令;- 若需要去除子项的缩进,可将
child.text改为child.text.strip(),即可得到无缩进的子命令文本。
内容的提问来源于stack exchange,提问作者pyjedy
相关产品推荐
相关产品推荐

