自动生成网络拓扑图:基于LLDP信息的智能更新脚本方案
项目背景
在大型企业或园区网项目中,网络设备(尤其是交换机)数量庞大、更新频繁。甲方运维人员希望能 实时掌握网络设备间的互联关系,并将拓扑图保持为最新状态,以支持:
- 故障定位时快速查看上下游连接关系
- 网络变更时评估影响范围
- 项目交付时形成标准的文档资料
过去这些拓扑图多为手工绘制,存在以下痛点:
- 工作量大:设备多达几十台甚至上百台,人工绘图效率低;
- 更新滞后:设备更换或端口调整后,图纸未能同步更新;
- 准确性差:容易因人工遗漏或错误造成图纸失真。
因此,需要一套自动化方案,利用现有网络协议采集设备间连接信息,一键生成或更新拓扑图。
目标需求
- 自动提取设备间连接关系(LLDP 信息);
- 支持多设备批量处理(每台设备导出 LLDP 信息);
- 输出标准格式的 Excel 文件,用于 Visio 或绘图工具自动生成拓扑图;
- 去除重复链路记录(避免 A ↔ B 显示两次);
- 简易部署和使用,适合定期运行。
技术原理
使用 LLDP 协议(Link Layer Discovery Protocol)
网络设备之间会通过 LLDP 交换接口、设备名、管理 IP、能力等信息。通过执行命令:
display lldp neighbor-information verbose可以获取完整的邻居信息,包括:
- 本地端口(Local Interface)
- 对端设备名称(System Name)
- 对端端口(Port ID)
- 对端管理地址(Management Address)
脚本实现
我们使用 Python 脚本自动完成以下步骤:
- 批量读取当前目录下所有交换机导出的
.txt文件; - 从每个文件名提取本端设备名称;
- 提取关键信息字段;
- 将 A↔B 与 B↔A 的重复链路只保留一条;
- 导出 Excel 文件供 Visio 使用。
示例输出字段
| LocalDevice | LocalInterface | NeighborName | NeighborPort | NeighborIP |
|---|---|---|---|---|
| SW-CORE | GigabitEthernet1/1/1 | SW-1F | GigabitEthernet0/0/1 | 10.10.1.1 |
| SW-1F | GigabitEthernet0/0/2 | SW-2F | GigabitEthernet0/0/1 | 10.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,批量生成表格,表格内的上联下联重复的链路进行自动重删。