
简介压缩包内的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 里全部表格读成 JSONpip install python-docxfrom 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[ftable_{idx}] {header: header, rows: rows} print(json.dumps(tables, ensure_asciiFalse, indent2))这个脚本做的事很简单用Document.tables直接取到 Word 文档里所有表格把第一行当作表头剩下的行转成字段字典。zip(header, values)把表头和单元格一一配对if not any(values)跳过完全空的行ensure_asciiFalse保证中文不乱码。跑完会看到table_0、table_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低缩进错了没法看极低文本天然适合 gitdocx 读起来麻烦一点换来的是「文档有人维护」。自动化项目死在数据没人更新上的概率远大于死在库选型上。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(loaderFileSystemLoader(templates)) template env.get_template(switch.j2) for dev in devices: config template.render(devicedev) with open(fout/{dev[name]}.conf, w, encodingutf-8) as f: f.write(config)对应模板templates/switch.j2hostname {{ 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 -ndisplay 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 -E抓vlan 数字这种行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 -80pandoc 把 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 21; then echo 配置漂移$dev fi done这段循环把每台设备的期望配置和实际配置逐份比对diff -q只看有无差异不输出细节。有漂移就打印设备名没有就保持安静适合挂进巡检脚本。建议每次割接次日跑一次平时每周跑一次。跑完如果漂移列表为空说明设备配置和配套文档一致不为空就回到第 3 章的 diff 流程把差异归入「要补」「要删」「要改」三类改完再跑一遍直到列表为空。下一次提交交付文档时先跑一次这个循环你会发现省下来的核对时间远不止画图那半小时。本文还有配套的精品资源点击获取