我需要通过中间的某个命令来获取块的完整配置。 在下面的示例中,我得到了一个不完整的块,其中缺少更多缩进的子项“ip 10.2.2.1”。
from ciscoconfparse import CiscoConfParse
from pprint import pprint
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']
帮助我找到获得下一个输出的优雅方法(使用“ip 10.2.2.1”)
['interface Vlan2', ' description vlan2', ' ip address 10.2.2.3/24', ' hsrp 2', 'ip 10.2.2.1']
for block in ccp.find_objects_w_child("interface", "ip address 10.2.2.3/24"): # find interfaces with this ip
# Print block line and all children
print([c.text for c in (block, *block.all_children)])
似乎可以解决问题。 我认为可能有一种更简单的方法来打印块及其子块,但我对
ciscoconfparse
API 不太熟悉。
使用 CiscoConfParse 1.9.37...
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.splitlines())
# Use recurse=True to search through multiple child levels...
# Use \d to ensure that you select the HSRP address instead of 'ip address'
addrobj = ccp.find_child_objects("interface\s+Vlan2", "ip\s+\d\S+", recurse=True)[0]
hsrp_addr = addrobj.re_match("ip (\S.+)")
print(hsrp_addr)
print("")
print(hsrp_addr.lineage)
打印:
10.2.2.1
[<IOSCfgLine # 1 'interface Vlan2'>, <IOSCfgLine # 4 ' hsrp 2' (parent is # 1)>, <IOSCfgLine # 5 ' ip 10.2.2.1' (parent is # 4)>]
要获取完整的父对象块,只需在该对象上使用
all_parents
...
你应该避免
find_blocks()
,总的来说它不如find_child_objects()
那么有用