自动生成网络拓扑图:基于LLDP信息的智能更新脚本方案

项目背景

在大型企业或园区网项目中,网络设备(尤其是交换机)数量庞大、更新频繁。甲方运维人员希望能 实时掌握网络设备间的互联关系,并将拓扑图保持为最新状态,以支持:

  • 故障定位时快速查看上下游连接关系
  • 网络变更时评估影响范围
  • 项目交付时形成标准的文档资料

过去这些拓扑图多为手工绘制,存在以下痛点:

  • 工作量大:设备多达几十台甚至上百台,人工绘图效率低;
  • 更新滞后:设备更换或端口调整后,图纸未能同步更新;
  • 准确性差:容易因人工遗漏或错误造成图纸失真。

因此,需要一套自动化方案,利用现有网络协议采集设备间连接信息,一键生成或更新拓扑图


目标需求

  1. 自动提取设备间连接关系(LLDP 信息);
  2. 支持多设备批量处理(每台设备导出 LLDP 信息);
  3. 输出标准格式的 Excel 文件,用于 Visio 或绘图工具自动生成拓扑图;
  4. 去除重复链路记录(避免 A ↔ B 显示两次);
  5. 简易部署和使用,适合定期运行

技术原理

使用 LLDP 协议(Link Layer Discovery Protocol)

网络设备之间会通过 LLDP 交换接口、设备名、管理 IP、能力等信息。通过执行命令:

display lldp neighbor-information verbose

可以获取完整的邻居信息,包括:

  • 本地端口(Local Interface)
  • 对端设备名称(System Name)
  • 对端端口(Port ID)
  • 对端管理地址(Management Address)

脚本实现

我们使用 Python 脚本自动完成以下步骤:

  1. 批量读取当前目录下所有交换机导出的 .txt 文件
  2. 从每个文件名提取本端设备名称
  3. 提取关键信息字段
  4. 将 A↔B 与 B↔A 的重复链路只保留一条
  5. 导出 Excel 文件供 Visio 使用

示例输出字段

LocalDeviceLocalInterfaceNeighborNameNeighborPortNeighborIP
SW-COREGigabitEthernet1/1/1SW-1FGigabitEthernet0/0/110.10.1.1
SW-1FGigabitEthernet0/0/2SW-2FGigabitEthernet0/0/110.10.1.2

脚本代码

以下是核心代码段:

import os
import re
import pandas as pd
from glob import glob

def parse_lldp_file(file_path):
    local_device = os.path.splitext(os.path.basename(file_path))[0]
    with open(file_path, 'r', encoding='utf-8') as f:
        content = f.read()

    blocks = re.findall(r'(LLDP neighbor-information of port.*?)(?=LLDP neighbor-information of port|\Z)', content, flags=re.DOTALL)
    results = []
    for block in blocks:
        local_if = re.search(r'\[([^\]]+)\]', block)
        neighbor_name = re.search(r'System name\s*:\s*(.+)', block)
        neighbor_port = re.search(r'Port ID\s*:\s*(.+)', block)
        neighbor_ip = re.search(r'Management address\s*:\s*([\d\.]+)', block)

        if local_if and neighbor_name:
            results.append({
                'LocalDevice': local_device,
                'LocalInterface': local_if.group(1).strip(),
                'NeighborName': neighbor_name.group(1).strip(),
                'NeighborPort': neighbor_port.group(1).strip() if neighbor_port else '',
                'NeighborIP': neighbor_ip.group(1).strip() if neighbor_ip else ''
            })

    return results

def remove_bidirectional_duplicates(df):
    df['link_key'] = df.apply(lambda row: tuple(sorted([
        (row['LocalDevice'], row['LocalInterface']),
        (row['NeighborName'], row['NeighborPort'])
    ])), axis=1)
    df = df.drop_duplicates(subset='link_key')
    df = df.drop(columns='link_key')
    return df

if __name__ == "__main__":
    all_records = []
    for file in glob("*.txt"):
        all_records.extend(parse_lldp_file(file))

    df = pd.DataFrame(all_records, columns=[
        "LocalDevice", "LocalInterface", "NeighborName", "NeighborPort", "NeighborIP"
    ])

    df_cleaned = remove_bidirectional_duplicates(df)
    df_cleaned.to_excel("lldp_links_combined.xlsx", index=False)
    print("✅ 拓扑链路信息已导出:lldp_links_combined.xlsx")

✅ 效果与优势

  • ✅ 自动化处理,无需手工绘图
  • ✅ 支持任意规模设备批量导入
  • ✅ 消除链路冗余,提高拓扑图清晰度和准确率
  • ✅ 脚本可集成进 CI/CMDB 系统,定时更新网络拓扑

后续可扩展方向

  • 解析 LLDP 的 VLAN 信息、端口速率等更多字段;
  • 自动导入 Visio API 实现绘图;
  • 与 CMDB 数据库联动;
  • 生成链路变更对比报告;

示例图(导入 Visio 后效果)

可通过 Visio 的 Data Visualizer 模板导入 Excel 自动生成网络拓扑图:
[SW-CORE]
   |
[SW-1F]——[SW-2F]

总结

通过 LLDP 协议 + Python 脚本自动采集网络互联关系,不仅极大提升了工作效率,还确保了网络拓扑文档的实时性与准确性,是自动化运维的重要组成部分。适用于校园网、园区网、企业网等多种网络环境。

如有类似需求,可以根据本脚本基础继续扩展。

更新日志

  • 更新计划:自动登录设备收集txt,自动拓扑图生成进行visio库兼容。
  • 厂家兼容性测试:

    • H3C
  • 2025.04.19 手动收集lldp信息导入txt,批量生成表格,表格内的上联下联重复的链路进行自动重删。
最后修改:2025 年 04 月 19 日
如果觉得我的文章对你有用,请随意赞赏