实验环境:
如图所示,sw1-sw5上分别已经配置了ssh,使用外部pc可以ssh到其中。
在本次实验中,主要使用了如下三个模块:
openpyxl,对excel文件进行操作。
gevent,使用协程,同时对五台设备进行操作。
napalm-huawei-vrp,ssh到交换机,并提取格式化信息。
python代码:
from napalm import get_network_driverfrom openpyxl import workbookfrom openpyxl.styles import color, patternfill, font, border, sideimport geventfrom gevent import monkeyfrom pprint import pprintmonkey.patch_all()# 设置模板为华为的vrp操作系统driver = get_network_driver('huawei_vrp')# 定义5台设备的ip地址,如果ip过多的话,可以通过数据库或者txt文件保存并读取devices_ip = ['192.168.0.11', '192.168.0.22', '192.168.0.33', '192.168.0.44', '192.168.0.55']def collect_basic_info(ip, fill, border): print(start:, ip) try: sw = driver(ip, 'prin', 'huawei@123') sw.open() print(ip + '连接成功') # 获取设备基础信息 basic_info = sw.get_facts() # pprint(basic_info) # 提取其中的hostname信息 hostname = basic_info.get('hostname') # 获取设备接口三层信息 interfaces_ip_info = sw.get_interfaces_ip() # pprint(interfaces_ip_info) # 返回设备名称和接口ip信息 # 在excel文件中,创建以hostname命名的sheet ws = wb.create_sheet(hostname) # 设置此sheet中记录数据的类别 ws['a1'] = 'interfaces' ws['b1'] = 'ip' ws['c1'] = 'mask' # 设置背景颜色 ws['a1'].fill = fill ws['b1'].fill = fill ws['c1'].fill = fill # 创建要写入数据的列表 interfaces_list = [] ip_addr_list = [] mask_list = [] # 根据pprint(interfaces_ip_info)的打印信息,进行处理,提取接口名称、ip地址、mask保存到当前sheet中 for key, values in interfaces_ip_info.items(): interfaces_list.append(key) for ip, mask in values['ipv4'].items(): ip_addr_list.append(ip) mask_list.append(mask.get('prefix_length')) # 得到插入数据的行数,n+2的原因是因为range是左开右闭,并且excel的第一行也已经写入了数据类型(a1、b1、c1) row_numbers = [n + 2 for n in range(len(interfaces_list))] # 对excel当前sheet中指定的cell进行赋值 for interface, row in zip(interfaces_list, row_numbers): ws.cell(row=row, column=1, value=interface) for ip_addr, row in zip(ip_addr_list, row_numbers): ws.cell(row=row, column=2, value=ip_addr) for mask, row in zip(mask_list, row_numbers): ws.cell(row=row, column=3, value=mask) # 调整列的宽度(自适应数据长度),保证excel文件的美观性,首先创建一个名为dims的空字典 dims = {} # ws1.rows返回值的类型为生成器generator,其中包含每一排和每一列有交集的所有单元格 # (每一排中至少有一个单元格为非空),比如(a1,b1), (a2,b2), (a3,b3) for row in ws.rows: # 遍历每一排元组里的每一个元素(即单元格a1,b1,a2,b2,a3,b3) for cell in row: # 为每一个单元添加边框 cell.border = border # 如果单元格内容为非空,则用max()比较每一列下最长的字符,比如从a1和a2,a3相比较,b1和b2,b3相比较 if cell.value: # cell.column_letter返回的值是单元格所在的列的名称,其数据类型为字符串,比如a1,a2,a3返回'a',b1,b2,b3则返回'b'。 # 第一次故意用dims.get(cell.column, 0)返回一个0,因为此时dims字典下还没有cell.column这个键名, # 字典的的get()函数在键名缺失的情况下会返回第二个我们给定的参数,即这里的0。 dims[cell.column_letter] = max((dims.get(cell.column_letter, 0), len(str(cell.value)))) # 遍历字典里的键值对,以每一排宽度最长的单元格作为自动调整单元格长度的标准, # 长度+1以确保列的宽度超过最长单元格的宽度 for col, value in dims.items(): ws.column_dimensions[col].width = value + 1 except exception as e: print(e) print(end:, ip)if __name__ == '__main__': # 调用openpyxl创建workbook对象,用来创建一个workbook,并将它赋值给变量wb wb = workbook() # 定义表格中的背景颜色和样式 yellowfill = patternfill(start_color='ffff00', end_color='ffff00', fill_type='solid') thin_border = border(left=side(style='thin'), right=side(style='thin'), top=side(style='thin'), bottom=side(style='thin')) # 同时执行5个任务 tasks = [gevent.spawn(collect_basic_info, ip, yellowfill, thin_border) for ip in devices_ip] all_result = gevent.joinall(tasks) # 删除掉默认的sheet ws = wb[sheet] wb.remove(ws) # 查看存在哪些表 print(wb.sheetnames) # 保存excel信息 wb.save('huawei_interface_ip_info.xlsx')
pycharm运行结果:
查看excel上的最终结果:
中美两国在人工智能领域应当怎么做
分享一个有趣的LED装饰项目
电池电极的纳米级电路详解
RealTalk系统利用文本输入生成逼近真人声音 社会影响巨大
互动投影是什么,有什么作用
怎么使用python提取华为交换机的接口IP信息保存到excel中呢?
磐石测控:非标定制-轴承扭力试验机的内容结构?
IP网络监控摄像机安装事项
使用esp8266实现STM32联网(最简单USART方法)
明年的一月!谷歌将把WebVR1.1带到Daydream
安全积分超市落地工地安全生产大变化
赛灵思推出两种实时视频转码解决方案,专为实现高质量直播视频而开发
对比韩企存储技术,长江存储发展如何
采用RS-485总线方式实现视频字符叠加器的设计方案
ZETag云标签_日本索喜即将量产支持纵行科技Advanced M-FSK标准的物联网芯片
2018年华为智能手机出货突破2亿台:Mate系列和P系列出货近3000万台
想要使用 Linux 命令,但又不想离开 Windows?
每日一课 | 在智慧灯杆里,边缘计算具体是指什么?
广凌招标采购管理系统|能解决学校招采管控痛点问题?
米尔科技KEIL C51开发工具版本比较