IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 使用python提取华为交换机的接口IP信息保存到excel中(ensp模拟器) -> 正文阅读

[Python知识库]使用python提取华为交换机的接口IP信息保存到excel中(ensp模拟器)

实验环境:

在这里插入图片描述
如图所示,SW1-SW5上分别已经配置了SSH,使用外部PC可以SSH到其中。

在本次实验中,主要使用了如下三个模块:

  1. openpyxl,对excel文件进行操作,具体可以参考:https://zhuanlan.zhihu.com/p/317826761
  2. gevent,使用协程,同时对五台设备进行操作,可以参考:https://blog.csdn.net/tushanpeipei/article/details/116612802?spm=1001.2014.3001.5501
  3. napalm-huawei-vrp,SSH到交换机,并提取格式化信息,可以参考:https://blog.csdn.net/tushanpeipei/article/details/117531627?spm=1001.2014.3001.5501

python代码:

from napalm import get_network_driver
from openpyxl import Workbook
from openpyxl.styles import Color, PatternFill, Font, Border, Side
import gevent
from gevent import monkey
from pprint import pprint

monkey.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上的最终结果:

在这里插入图片描述
参考资料:
网络工程师的Python之路—https://zhuanlan.zhihu.com/p/317826761

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章           查看所有文章
加:2021-07-05 20:19:50  更:2021-07-05 20:20:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 5:26:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码