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

如何通过中间命令获取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)

关键说明

  1. find_lines vs find_blocks:find_lines返回行对象(而非纯文本),可通过parent属性追溯到所属的父配置块;
  2. get_children(recursive=True):开启递归后,会获取所有嵌套层级的子配置行,确保不遗漏深层缩进的命令;
  3. 若需要去除子项的缩进,可将child.text改为child.text.strip(),即可得到无缩进的子命令文本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:15:27