用python-docx解析网络拓扑配置文件生成设备配置
2026/9/23 21:36:40 网站建设 项目流程

简介:压缩包内的docx文档是一份企业网络设计与仿真实现中的网络拓扑配置文件,面向计算机网络课程学习者、实验实训人员及网络运维新手,解决交换机分层配置无从下手的问题。包内共1个docx文件,约1.43MB,内容完整覆盖接入层与核心层交换机的核心配置。文档以技术部接入交换机为例,从设置主机名、配置enable secret和VTY口令、设置exec-timeout与关闭DNS解析入手,逐步展开VTP客户端模式、管理VLAN地址、访问端口VLAN划分、Trunk主干道封装,以及MAC地址与端口绑定的防ARP欺骗策略,同时包含两台核心交换机的VLAN信息与命名配置。读者可以参照分步说明在仿真拓扑中复现并排查配置,理解每条命令的作用。已有2500人浏览学习,适合需要完成课程设计、毕业设计或企业网络配置实践的读者下载参考。

1. 配套的网络拓扑配置文件.docx:交付物不是附件

拿到一个叫「配套的网络拓扑配置文件.docx」的文件,很多人的第一反应是打开看一眼拓扑结构示意图。但真正干过交付的人都知道,图片只是入口,价值在它背后那套能和设备配置对上的信息:接口、VLAN、IP、路由、安全策略。下面来把这个 docx 当作网络项目的单一事实来源,让文档里的表格能被脚本读取、转成设备配置、再和 running-config 比对。适合正在做园区网络交付、机房割接、日常巡检的人,不需要很强的开发经验,但你手边得有一个能跑 Python 的终端环境。

2. 拓扑图到配置的一致性:网络拓扑配置文件 docx 里该放哪些信息

2.1 一份可用的网络拓扑配置文件 docx 该包含哪些表

在动手写脚本之前,先定义「配套」到底配套到什么程度。一份能支撑配置生成和比对的 docx,至少要有下面这几张表,缺任何一张都会在生成配置或排障时露出破绽。

表名关键字段缺了它会发生什么
设备清单设备名、型号、角色、管理地址脚本不知道有哪些设备,生成和巡检都无从谈起
接口连接表本端设备/接口、对端设备/接口、链路类型拓扑图上有线,配置里没有端口对,排障全靠猜
VLAN 规划表VLAN ID、名称、三层网关、DHCP 网段交换机 VLAN 建不全,终端拿不到正确网段
IP 编址表接口名、IP 地址、掩码、描述接口地址只能手填,最容易写错
路由参数协议、区域/进程号、宣告网段、认证方式OSPF 区域或静态路由优先级不一致,业务路径不符合设计
公共服务NTP、SNMP、syslog 地址与安全参数设备时间不一致,日志无法集中,告警少了一半

这些表不需要一次做全,但必须从第一天就有空表壳。否则等工程收尾再补数据,没人愿意填,文档很快就会和设备脱节。

2.2 为什么「能对上」比「画得全」更重要

「大型园区网络拓扑及配置实例」这类资料大家应该都看过,拓扑结构示意图长得差不多:核心、汇聚、接入三层,下面挂着服务器区和办公区。图里不会告诉你的,恰恰是要敲进设备的命令。举个例子:核心和汇聚之间画了两条线,到底是链路聚合还是两条独立三层链路加浮动路由?这两条线在配置上的差异是一整套参数,聚合组、负载均衡算法、最少链路数、双主检测,画图时一个箭头就带过了。

所以我的习惯是:图只负责让人理解结构,表里的「另一端」才决定配置正确性。每个接口都必须写出本端和对端两个地址,哪怕两端就在同一个机柜里。文档里写「上联核心」这种话,在脚本眼里等于没有。接口编号、VLAN 号、IP 网段只要有一位对不上,这份 docx 的价值就归零。

2.3 用 python-docx 把表读成结构化数据

先安装依赖,然后写一个最小脚本,把这个 docx 里全部表格读成 JSON:

pip install python-docx
from docx import Document import json doc = Document("配套的网络拓扑配置文件.docx") tables = {} for idx, table in enumerate(doc.tables): header = [c.text.strip() for c in table.rows[0].cells] rows = [] for row in table.rows[1:]: values = [c.text.strip() for c in row.cells] if not any(values): continue rows.append(dict(zip(header, values))) tables[f"table_{idx}"] = {"header": header, "rows": rows} print(json.dumps(tables, ensure_ascii=False, indent=2))

这个脚本做的事很简单:用Document.tables直接取到 Word 文档里所有表格,把第一行当作表头,剩下的行转成字段字典。zip(header, values)把表头和单元格一一配对;if not any(values)跳过完全空的行;ensure_ascii=False保证中文不乱码。跑完会看到table_0table_1这样的键,下一步再根据表头内容做路由,区分设备清单、接口连接表和 VLAN 规划表。

提示:表头如果有合并单元格,row.cells会把合并单元格的值重复很多遍,列名会错位。遇到这种情况,先手工把源表格的合并单元格拆开再重跑脚本,比在代码里猜列名省时间。

3. 用脚本把网络拓扑配置文件里的清单抽出来,生成设备配置初稿

3.1 为什么选 docx 而不是 YAML 或 Excel

做配置自动化的人,第一反应总是把配置源改成 YAML 或 Excel。YAML 干净、可版本化,Excel 行列分明。可实际交付场景里,业主和验收方要的不是 YAML,而是一份能直接打开、能打印签字的 Word 文档。你让业务同事去改 YAML,他大概率会把缩进改坏;让他改 docx 表格,他只会多填一列内容。所以常见做法是:交付时保留 docx 作为人工维护的入口,脚本读完 docx 生成中间层 YAML,再进 Jinja2 模板渲染设备配置。

配置源业务同事可维护性脚本读取成本版本管理
docx 表格高,天生就是给人看的低,python-docx 一个库解决二进制,需要先转文本再入库
Excel中,公式和合并单元格容易乱低,pandas 或 openpyxl二进制,同样要先转格式
YAML低,缩进错了没法看极低文本,天然适合 git

docx 读起来麻烦一点,换来的是「文档有人维护」。自动化项目死在数据没人更新上的概率,远大于死在库选型上。

3.2 从 docx 配置文件里的设备清单渲染交换机配置

假设 docx 里有一张表,表头是「设备名、管理地址、VLAN 列表」。下面这段脚本按表头关键字定位这张表,再渲染成配置:

from docx import Document from jinja2 import Environment, FileSystemLoader import re doc = Document("配套的网络拓扑配置文件.docx") devices = [] for table in doc.tables: header = [c.text.strip() for c in table.rows[0].cells] if "设备名" not in header or "管理地址" not in header: continue for row in table.rows[1:]: cells = [c.text.strip() for c in row.cells] if not any(cells): continue row = dict(zip(header, cells)) vlans = [v.strip() for v in re.split(r"[,,、\s]+", row.get("VLAN 列表", "")) if v.strip()] devices.append({ "name": row["设备名"], "mgmt_ip": row["管理地址"], "vlans": vlans, }) break env = Environment(loader=FileSystemLoader("templates")) template = env.get_template("switch.j2") for dev in devices: config = template.render(device=dev) with open(f"out/{dev['name']}.conf", "w", encoding="utf-8") as f: f.write(config)

对应模板templates/switch.j2

hostname {{ device.name }} ! interface vlan 1 ip address {{ device.mgmt_ip }} 255.255.255.0 ! {% for vid in device.vlans %} vlan {{ vid }} ! {% endfor %}

逻辑说明:脚本把人工维护的 docx 变成一组.conf文件,只负责「生成初稿」,不负责直接下发。re.split(r"[,,、\s]+", ...)兼容 VLAN 列表里的英文逗号、中文逗号和顿号,比单独split(",")更抗造。break确保只处理第一张命中的表,避免设备和接口表混在一起。模板里每个vlan后面加!分隔符,是为了让生成文本接近真实设备格式,后面做 diff 时少一点干扰。

换设备品牌时不需要改脚本,只换模板就行。华为的接口叫interface GigabitEthernet0/0/1,思科的写法是interface Gi0/1,把switch.j2换成对应品牌的模板,脚本内部还是同一个字典输入。

3.3 与 running-config 做 diff,找出漂移点

生成配置只完成一半,另一半是拿它跟设备当前配置比对。把每台设备的 running-config 导出来存成本地文件,然后做差异预览:

# 导出设备配置,落成本地文件 # 华为设备:display current-configuration > running.conf # 思科设备:show running-config > running.conf # 忽略空行后的差异预览 diff -u --strip-trailing-cr \ <(sed '/^$/d' running.conf) \ <(sed '/^$/d' out/Core-SW1.conf) | head -60

参数说明:--strip-trailing-cr处理 Windows 换行符;sed '/^$/d'删除空行,docx 模板渲染出来的配置常带着模板空行,不删会全是噪音。<(...)是进程替换,两个文件直接比较,不产生临时文件。这种 diff 的用途是把「文档和实际配置之间差了什么」暴露出来,差异分三类:文档有设备没配,要补;设备有文档没写,要么是还跑着业务的遗留,要么是垃圾配置;两端都有但参数不同,以业务需求为准判断。看到 diff 先别急着改设备,把差异归好类再动手。

4. 园区网络拓扑配置的三个常见坑

4.1 接口编号与物理端口对不上时先用 LLDP 取证

大型园区网络拓扑及配置实例里的接口表,写的时候往往还在规划阶段。交付那天跳线是谁插的、有没有插错,基本不按文档走。最常见的故障是:文档写核心的 XG0/0/1 连汇聚的 XG0/0/2,实际跳线插到了 XG0/0/3,链路状态倒是 up,可 VLAN、聚合组全对不上。

我一般不会先去拔线,而是先看 LLDP 邻居:

# 华为交换机 display lldp neighbor brief # 思科交换机 show lldp neighbors detail

回显里的对端设备名和接口号是设备自己报上来的,比文档可靠。检查完把真实关系改回 docx 的接口连接表,再继续生成配置。注意 LLDP 要全局开启,华为是lldp enable,思科是lldp run,没开的话查出来是空的,所以这条最好提前写进模板基础配置里。

4.2 ensp 里 DHCP/DNS 参数漏出文档,割接必翻车

用 ensp 搭过 dhcp dns 网络拓扑的人会有印象:拓扑能通,多半不是地址池写对了,而是「文档里根本没写地址池」。园区网最常见的问题是内网 DNS 和公网 DNS 搞混,或者 DHCP 地址池网段与 VLAN 接口地址不在同一段。以下参数必须在 docx 的 VLAN 规划表里占一格,否则运维接手时只能上设备翻配置:

参数常见错误建议填法
地址池网段和 VLAN 接口不在同一段与对应三层接口地址同网段
网关漏写或写成别的网段地址对应 VLAN 的三层接口地址
DNS 列表只写公网 DNS内网 DNS 优先,公网兜底
租期统一用默认一天地址紧张的办公区写 2h 到 8h
排除地址把打印机和服务器地址也放进地址池预留一段地址不参与动态分配

排查时先看设备上的地址池使用情况:

# 查看某个地址池的分配记录 display ip pool vlan20 used # 终端侧抓 DHCP 报文,看 OFFER 有没有回来 # tcpdump -i eth0 port 67 or port 68 -n

display ip pool会列出已分配地址和剩余地址;tcpdump在终端上执行,抓不到 OFFER 就说明 DHCP 请求没到服务器,回头查 VLAN 接口下的dhcp select和中继配置。把这些参数在 docx 里写清楚,排障时间能省掉一半以上。

4.3 设备上有、文档里没有的残留配置项怎么筛

清理配置时,diff 会出现大量「仅在当前配置里出现」的行。这些行分两种:新加的临时策略,早该删掉的残留。用脚本分别筛出两类 VLAN 的例子:

# 去掉行首缩进,避免格式干扰 sed 's/^[[:space:]]*//' running.conf | grep -E '^vlan [0-9]+$' | awk '{print $2}' | sort -u > actual_vlans.txt sed 's/^[[:space:]]*//' out/Core-SW1.conf | grep -E '^vlan [0-9]+$' | awk '{print $2}' | sort -u > expect_vlans.txt # 设备上有、文档里没有的 VLAN comm -13 expect_vlans.txt actual_vlans.txt # 文档里有、设备上没有的 VLAN comm -23 expect_vlans.txt actual_vlans.txt

逻辑说明:sed去掉行首空白,grep -Evlan 数字这种行,awk '{print $2}'取第二列,sort -u去重后交给comm-13输出第二个文件独有,对应「要确认后再删」的项;-23输出第一个文件独有,对应「设备漏配」的项。拿到「设备上独有」的 VLAN 列表后,逐个查display vlan <id>里有哪些接口,确认没有端口属于它再清理。直接删是所有方案里最坏的选择,残留配置背后往往挂着没人说得清的历史业务。

5. 把网络拓扑配置文件纳入版本化与审核流程

5.1 用 pandoc 把 docx 变成可 diff 的文本,保留配置变更记录

docx 是二进制压缩包,直接进 git 只能看到「文件变了」,看不到哪里变了。解决办法是先转成纯文本,再和 docx 一起提交到仓库:

pandoc "配套的网络拓扑配置文件.docx" -t plain -o topology.txt git add "配套的网络拓扑配置文件.docx" topology.txt git commit -m "docs: 更新核心到汇聚合路后的接口连接表" git diff HEAD~1 -- topology.txt | head -80

pandoc 把 Word 表格转成纯文本时,单元格顺序会保留,但合并单元格结构会变平。短 diff 看语义没问题,想精确到单元格还是回到 python-docx 读表结构。这个提交策略保证每次文档修订都有记录,设备配置脚本跟着这份文本走,不会出现「文档更新了、配置没同步」的断档。

5.2 文档回读巡检:设备配置与 docx 互相验证

例行巡检时,把「文档生成配置」和「设备当前配置」做一次全量比对:

for f in out/*.conf; do dev=$(basename "$f") if [ -f "running/$dev.conf" ] && ! diff -q "$f" "running/$dev.conf" >/dev/null 2>&1; then echo "配置漂移:$dev" fi done

这段循环把每台设备的期望配置和实际配置逐份比对,diff -q只看有无差异,不输出细节。有漂移就打印设备名,没有就保持安静,适合挂进巡检脚本。建议每次割接次日跑一次,平时每周跑一次。跑完如果漂移列表为空,说明设备配置和配套文档一致;不为空,就回到第 3 章的 diff 流程,把差异归入「要补」「要删」「要改」三类,改完再跑一遍直到列表为空。下一次提交交付文档时,先跑一次这个循环,你会发现省下来的核对时间,远不止画图那半小时。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询