处理思科设备 show inventory输出内容
任务目标
通过Python读取show inventory的内容,并将设备的槽位、模块型号和序列号自动写入CVS文件。否则,我需要打开每一个文件,找到设备每一个槽位、母卡、子卡和序列号,并一一填写到表格中。操作繁琐且重复,因此考虑用Python实现。
show inventory 输出内容示例
RP/0/RP0/CPU0:crs-1#admin show inventory
Thu Jul XX 16:08:46.990 GMT
NAME: "0/1/*", DESCR: "Cisco CRS Series Modular Services Card 400G"
PID: CRS-MSC-X, VID: V03, SN: CAT20XXXX0J
NAME: "ControlEthernet0/1/CPU0", DESCR: "CPU_PORT_0"
PID: , VID: N/A, SN:
NAME: "0/PL1/*", DESCR: "Cisco CRS Series 4x100GbE Interface Module"
PID: 4X100GE-LO, VID: V01, SN: CATXXXXT00W
NAME: "HundredGigE0/1/0/0", DESCR: "100GBASE-LR4"
PID: CPAK-100G-LR4 , VID: V04, SN: FBNXXXX0141
NAME: "HundredGigE0/1/0/1", DESCR: "100GBASE-LR4"
PID: CPAK-100G-LR4 , VID: V04, SN: FBNXXXX0582
NAME: "HundredGigE0/1/0/2", DESCR: "100GBASE-LR4"
PID: CPAK-100G-LR4 , VID: V04, SN: FBNXXXX0546
NAME: "HundredGigE0/1/0/3", DESCR: "100GBASE-LR4"
PID: CPAK-100G-LR4 , VID: V04, SN: FBNXXXX0340
NAME: "0/4/*", DESCR: "Cisco CRS-1 Series Modular Services Card revision B"
PID: CRS-MSC-B, VID: V07, SN: SADXXXX020C
NAME: "ControlEthernet0/4/SP", DESCR: "CPU_PORT_0"
PID: , VID: N/A, SN:
NAME: "ControlEthernet0/4/CPU0", DESCR: "CPU_PORT_1"
PID: , VID: N/A, SN:
NAME: "0/PL4/*", DESCR: "Cisco Carrier Routing System SPA Interface Processor Card"
PID: CRS1-SIP-800, VID: V04, SN: SALXXXXGX57
NAME: "0/4/0", DESCR: "1-port OC192/STM64 POS/RPR XFP Optics"
PID: SPA-OC192POS-XFP, VID: V05, SN: SALXXXXFAN0
Python代码的实现
# 引入re、csv模块
import re
import csv
# 将待处理的文件读入data_buff。
with open(inventory) as file_obj:
data_buff = file_obj.read()
# 定义几个正则表达式对象如下:
mixRegex = re.compile(r'^NAME: .*\n'
r'^PID: .*SN: .*'
,re.MULTILINE)
mix_match = mixRegex.findall(data_buff)
nameRegex = re.compile('^NAME: .*,')
modRegex = re.compile('^PID: .*,',re.MULTILINE)
snRegex = re.compile('SN: .*',re.MULTILINE)
# 以上几个正则表达式的目的如下:
# mixRegex,该表达式匹配以”NAME:”开头,并且,第二行以”PID:”开头,包含”SN:”。
# 通过findall函数找到所有符合上述要求的文本内容,并赋值给mix_match,通过打印,该值是一个list,每一个匹配项作为一个列表单元。
# nameRegex、modRegex和snRegex分别在以下代码中进行过滤
# 初始化两个列表,其中一个作为子列表,最终形成一个二维列表。
slot_map = []
sub_map = []
# for循环遍历上述的查找结果mix_match;
# 通过nameRegex查找出来的内容,使用group()访问,并将”NAME: ”剥去,就变成槽位信息了。字符最后多一个”””是为了防止Excel表自动的把0/4/0改成日期。len(slot) < 10,是去除一些不需要统计的内容,如"ControlEthernet0/4/SP"。
# 通过modRegex查找出来的内容,经过处理后就变成PID信息了。
# 通过snRegex查找出来的内容,经过处理就变成SN信息了。
# 然后分别把这些信息存入list sub_map中,再存到slot_map,变为二维表。
for each_pair in mix_match:
slot = nameRegex.search(each_pair).group()[7:-1]
if len(slot) < 10:
card = modRegex.search(each_pair).group().split(',')[0][5:].strip()
sn = snRegex.search(each_pair).group()[4:]
# print(sn)
sub_map.append(slot)
sub_map.append(card)
sub_map.append(sn)
slot_map.append(sub_map)
# print(sub_map)
sub_map = []
# 以下代码将上述生成的二维列表写入到CSV文件中。
csv_output = inventory + '-slotmap.csv'
with open(csv_output,'w') as file_obj:
wr = csv.writer(file_obj)
for list in slot_map:
wr.writerow(list)
前一篇文章写了处理show ip int brief输出。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。