絡拓撲配置文件生成設備配置)
簡介壓縮包內(nèi)的docx文檔是一份企業(yè)網(wǎng)絡設計與仿真實現(xiàn)中的網(wǎng)絡拓撲配置文件面向計算機網(wǎng)絡課程學習者、實驗實訓人員及網(wǎng)絡運維新手解決交換機分層配置無從下手的問題。包內(nèi)共1個docx文件約1.43MB內(nèi)容完整覆蓋接入層與核心層交換機的核心配置。文檔以技術部接入交換機為例從設置主機名、配置enable secret和VTY口令、設置exec-timeout與關閉DNS解析入手逐步展開VTP客戶端模式、管理VLAN地址、訪問端口VLAN劃分、Trunk主干道封裝以及MAC地址與端口綁定的防ARP欺騙策略同時包含兩臺核心交換機的VLAN信息與命名配置。讀者可以參照分步說明在仿真拓撲中復現(xiàn)并排查配置理解每條命令的作用。已有2500人瀏覽學習適合需要完成課程設計、畢業(yè)設計或企業(yè)網(wǎng)絡配置實踐的讀者下載參考。1. 配套的網(wǎng)絡拓撲配置文件.docx交付物不是附件拿到一個叫「配套的網(wǎng)絡拓撲配置文件.docx」的文件很多人的第一反應是打開看一眼拓撲結(jié)構(gòu)示意圖。但真正干過交付的人都知道圖片只是入口價值在它背后那套能和設備配置對上的信息接口、VLAN、IP、路由、安全策略。下面來把這個 docx 當作網(wǎng)絡項目的單一事實來源讓文檔里的表格能被腳本讀取、轉(zhuǎn)成設備配置、再和 running-config 比對。適合正在做園區(qū)網(wǎng)絡交付、機房割接、日常巡檢的人不需要很強的開發(fā)經(jīng)驗但你手邊得有一個能跑 Python 的終端環(huán)境。2. 拓撲圖到配置的一致性網(wǎng)絡拓撲配置文件 docx 里該放哪些信息2.1 一份可用的網(wǎng)絡拓撲配置文件 docx 該包含哪些表在動手寫腳本之前先定義「配套」到底配套到什么程度。一份能支撐配置生成和比對的 docx至少要有下面這幾張表缺任何一張都會在生成配置或排障時露出破綻。表名關鍵字段缺了它會發(fā)生什么設備清單設備名、型號、角色、管理地址腳本不知道有哪些設備生成和巡檢都無從談起接口連接表本端設備/接口、對端設備/接口、鏈路類型拓撲圖上有線配置里沒有端口對排障全靠猜VLAN 規(guī)劃表VLAN ID、名稱、三層網(wǎng)關、DHCP 網(wǎng)段交換機 VLAN 建不全終端拿不到正確網(wǎng)段IP 編址表接口名、IP 地址、掩碼、描述接口地址只能手填最容易寫錯路由參數(shù)協(xié)議、區(qū)域/進程號、宣告網(wǎng)段、認證方式OSPF 區(qū)域或靜態(tài)路由優(yōu)先級不一致業(yè)務路徑不符合設計公共服務NTP、SNMP、syslog 地址與安全參數(shù)設備時間不一致日志無法集中告警少了一半這些表不需要一次做全但必須從第一天就有空表殼。否則等工程收尾再補數(shù)據(jù)沒人愿意填文檔很快就會和設備脫節(jié)。2.2 為什么「能對上」比「畫得全」更重要「大型園區(qū)網(wǎng)絡拓撲及配置實例」這類資料大家應該都看過拓撲結(jié)構(gòu)示意圖長得差不多核心、匯聚、接入三層下面掛著服務器區(qū)和辦公區(qū)。圖里不會告訴你的恰恰是要敲進設備的命令。舉個例子核心和匯聚之間畫了兩條線到底是鏈路聚合還是兩條獨立三層鏈路加浮動路由這兩條線在配置上的差異是一整套參數(shù)聚合組、負載均衡算法、最少鏈路數(shù)、雙主檢測畫圖時一個箭頭就帶過了。所以我的習慣是圖只負責讓人理解結(jié)構(gòu)表里的「另一端」才決定配置正確性。每個接口都必須寫出本端和對端兩個地址哪怕兩端就在同一個機柜里。文檔里寫「上聯(lián)核心」這種話在腳本眼里等于沒有。接口編號、VLAN 號、IP 網(wǎng)段只要有一位對不上這份 docx 的價值就歸零。2.3 用 python-docx 把表讀成結(jié)構(gòu)化數(shù)據(jù)先安裝依賴然后寫一個最小腳本把這個 docx 里全部表格讀成 JSONpip install python-docxfrom docx import Document import json doc Document(配套的網(wǎng)絡拓撲配置文件.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 文檔里所有表格把第一行當作表頭剩下的行轉(zhuǎn)成字段字典。zip(header, values)把表頭和單元格一一配對if not any(values)跳過完全空的行ensure_asciiFalse保證中文不亂碼。跑完會看到table_0、table_1這樣的鍵下一步再根據(jù)表頭內(nèi)容做路由區(qū)分設備清單、接口連接表和 VLAN 規(guī)劃表。提示表頭如果有合并單元格row.cells會把合并單元格的值重復很多遍列名會錯位。遇到這種情況先手工把源表格的合并單元格拆開再重跑腳本比在代碼里猜列名省時間。3. 用腳本把網(wǎng)絡拓撲配置文件里的清單抽出來生成設備配置初稿3.1 為什么選 docx 而不是 YAML 或 Excel做配置自動化的人第一反應總是把配置源改成 YAML 或 Excel。YAML 干凈、可版本化Excel 行列分明。可實際交付場景里業(yè)主和驗收方要的不是 YAML而是一份能直接打開、能打印簽字的 Word 文檔。你讓業(yè)務同事去改 YAML他大概率會把縮進改壞讓他改 docx 表格他只會多填一列內(nèi)容。所以常見做法是交付時保留 docx 作為人工維護的入口腳本讀完 docx 生成中間層 YAML再進 Jinja2 模板渲染設備配置。配置源業(yè)務同事可維護性腳本讀取成本版本管理docx 表格高天生就是給人看的低python-docx 一個庫解決二進制需要先轉(zhuǎn)文本再入庫Excel中公式和合并單元格容易亂低pandas 或 openpyxl二進制同樣要先轉(zhuǎn)格式Y(jié)AML低縮進錯了沒法看極低文本天然適合 gitdocx 讀起來麻煩一點換來的是「文檔有人維護」。自動化項目死在數(shù)據(jù)沒人更新上的概率遠大于死在庫選型上。3.2 從 docx 配置文件里的設備清單渲染交換機配置假設 docx 里有一張表表頭是「設備名、管理地址、VLAN 列表」。下面這段腳本按表頭關鍵字定位這張表再渲染成配置from docx import Document from jinja2 import Environment, FileSystemLoader import re doc Document(配套的網(wǎng)絡拓撲配置文件.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文件只負責「生成初稿」不負責直接下發(fā)。re.split(r[,、\s], ...)兼容 VLAN 列表里的英文逗號、中文逗號和頓號比單獨split(,)更抗造。break確保只處理第一張命中的表避免設備和接口表混在一起。模板里每個vlan后面加!分隔符是為了讓生成文本接近真實設備格式后面做 diff 時少一點干擾。換設備品牌時不需要改腳本只換模板就行。華為的接口叫interface GigabitEthernet0/0/1思科的寫法是interface Gi0/1把switch.j2換成對應品牌的模板腳本內(nèi)部還是同一個字典輸入。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參數(shù)說明--strip-trailing-cr處理 Windows 換行符sed /^$/d刪除空行docx 模板渲染出來的配置常帶著模板空行不刪會全是噪音。(...)是進程替換兩個文件直接比較不產(chǎn)生臨時文件。這種 diff 的用途是把「文檔和實際配置之間差了什么」暴露出來差異分三類文檔有設備沒配要補設備有文檔沒寫要么是還跑著業(yè)務的遺留要么是垃圾配置兩端都有但參數(shù)不同以業(yè)務需求為準判斷??吹?diff 先別急著改設備把差異歸好類再動手。4. 園區(qū)網(wǎng)絡拓撲配置的三個常見坑4.1 接口編號與物理端口對不上時先用 LLDP 取證大型園區(qū)網(wǎng)絡拓撲及配置實例里的接口表寫的時候往往還在規(guī)劃階段。交付那天跳線是誰插的、有沒有插錯基本不按文檔走。最常見的故障是文檔寫核心的 XG0/0/1 連匯聚的 XG0/0/2實際跳線插到了 XG0/0/3鏈路狀態(tài)倒是 up可 VLAN、聚合組全對不上。我一般不會先去拔線而是先看 LLDP 鄰居# 華為交換機 display lldp neighbor brief # 思科交換機 show lldp neighbors detail回顯里的對端設備名和接口號是設備自己報上來的比文檔可靠。檢查完把真實關系改回 docx 的接口連接表再繼續(xù)生成配置。注意 LLDP 要全局開啟華為是lldp enable思科是lldp run沒開的話查出來是空的所以這條最好提前寫進模板基礎配置里。4.2 ensp 里 DHCP/DNS 參數(shù)漏出文檔割接必翻車用 ensp 搭過 dhcp dns 網(wǎng)絡拓撲的人會有印象拓撲能通多半不是地址池寫對了而是「文檔里根本沒寫地址池」。園區(qū)網(wǎng)最常見的問題是內(nèi)網(wǎng) DNS 和公網(wǎng) DNS 搞混或者 DHCP 地址池網(wǎng)段與 VLAN 接口地址不在同一段。以下參數(shù)必須在 docx 的 VLAN 規(guī)劃表里占一格否則運維接手時只能上設備翻配置參數(shù)常見錯誤建議填法地址池網(wǎng)段和 VLAN 接口不在同一段與對應三層接口地址同網(wǎng)段網(wǎng)關漏寫或?qū)懗蓜e的網(wǎng)段地址對應 VLAN 的三層接口地址DNS 列表只寫公網(wǎng) DNS內(nèi)網(wǎng) DNS 優(yōu)先公網(wǎng)兜底租期統(tǒng)一用默認一天地址緊張的辦公區(qū)寫 2h 到 8h排除地址把打印機和服務器地址也放進地址池預留一段地址不參與動態(tài)分配排查時先看設備上的地址池使用情況# 查看某個地址池的分配記錄 display ip pool vlan20 used # 終端側(cè)抓 DHCP 報文看 OFFER 有沒有回來 # tcpdump -i eth0 port 67 or port 68 -ndisplay ip pool會列出已分配地址和剩余地址tcpdump在終端上執(zhí)行抓不到 OFFER 就說明 DHCP 請求沒到服務器回頭查 VLAN 接口下的dhcp select和中繼配置。把這些參數(shù)在 docx 里寫清楚排障時間能省掉一半以上。4.3 設備上有、文檔里沒有的殘留配置項怎么篩清理配置時diff 會出現(xiàn)大量「僅在當前配置里出現(xiàn)」的行。這些行分兩種新加的臨時策略早該刪掉的殘留。用腳本分別篩出兩類 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 數(shù)字這種行awk {print $2}取第二列sort -u去重后交給comm。-13輸出第二個文件獨有對應「要確認后再刪」的項-23輸出第一個文件獨有對應「設備漏配」的項。拿到「設備上獨有」的 VLAN 列表后逐個查display vlan id里有哪些接口確認沒有端口屬于它再清理。直接刪是所有方案里最壞的選擇殘留配置背后往往掛著沒人說得清的歷史業(yè)務。5. 把網(wǎng)絡拓撲配置文件納入版本化與審核流程5.1 用 pandoc 把 docx 變成可 diff 的文本保留配置變更記錄docx 是二進制壓縮包直接進 git 只能看到「文件變了」看不到哪里變了。解決辦法是先轉(zhuǎn)成純文本再和 docx 一起提交到倉庫pandoc 配套的網(wǎng)絡拓撲配置文件.docx -t plain -o topology.txt git add 配套的網(wǎng)絡拓撲配置文件.docx topology.txt git commit -m docs: 更新核心到匯聚合路后的接口連接表 git diff HEAD~1 -- topology.txt | head -80pandoc 把 Word 表格轉(zhuǎn)成純文本時單元格順序會保留但合并單元格結(jié)構(gòu)會變平。短 diff 看語義沒問題想精確到單元格還是回到 python-docx 讀表結(jié)構(gòu)。這個提交策略保證每次文檔修訂都有記錄設備配置腳本跟著這份文本走不會出現(xiàn)「文檔更新了、配置沒同步」的斷檔。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這段循環(huán)把每臺設備的期望配置和實際配置逐份比對diff -q只看有無差異不輸出細節(jié)。有漂移就打印設備名沒有就保持安靜適合掛進巡檢腳本。建議每次割接次日跑一次平時每周跑一次。跑完如果漂移列表為空說明設備配置和配套文檔一致不為空就回到第 3 章的 diff 流程把差異歸入「要補」「要刪」「要改」三類改完再跑一遍直到列表為空。下一次提交交付文檔時先跑一次這個循環(huán)你會發(fā)現(xiàn)省下來的核對時間遠不止畫圖那半小時。本文還有配套的精品資源點擊獲取