资讯动态

90DaysOfDevOps 網路自動化實戰:以 Python + Netmiko 管理 EVE-NG 虛擬網路設備

发布时间:2026/10/9 2:14:52 来源:尧图企业网站定制
文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载本篇是 #90DaysOfDevOps 網路基礎章節Day 27的實作指南基於 Day 26 建置的 EVE-NG 虛擬網路環境1 台 Cisco vIOS 路由器 4 台 vIOS 交換機帶領讀者完成「以 SSH 加密通道取代 Telnet 存取設備、用 Python 批量收集設備資訊、自動化下發 trunk 配置、以及定時備份設備配置」四大任務。讀完本文你將掌握 Paramiko 與 Netmiko 兩大 Python 網路自動化套件的核心用法並能直接套用 Networking 目錄 下提供的可執行腳本。1. 實驗環境回顧EVE-NG 虛擬網路拓撲在 Day 26 中我們在 EVE-NG 上建立了一個由1 台 Cisco vIOS 路由器R1與 4 台 vIOS 交換機SW1SW4組成的實驗拓撲路由器作為對外網關。設備在 EVE-NG 內部管理網路10.10.88.0/24上的地址如下NodeIP AddressRouter10.10.88.110Switch110.10.88.111Switch210.10.88.112Switch310.10.88.113Switch410.10.88.114Day 26 同時在 Networking 目錄 中為每一台設備保留了完整配置檔R1、SW1、SW2、SW3、SW4。以 R1 的配置輸出為例R1可以確認設備提示符為R1、hostname R1、運行version 15.6的 IOS 映像這些都是後續自動化腳本要面對的真實設備形態。要對這些設備執行自動化關鍵前提是你的工作站必須能直達設備的 SSH 埠。本文採用兩種方式在 EVE-NG 內部佈署一台裝有 Python 的 Linux 主機或者——本文的做法——透過 EVE-NG 的「Management(Cloud)」網路把設備橋接出來讓工作站在家庭網路上直接存取。2. 把虛擬設備橋接到家庭網路Management Cloud在 EVE-NG 畫布上右鍵 → Network → 選擇 Management(Cloud0)即可新增一個雲節點它會把 EVE-NG 的虛擬網路橋接到你的家庭網路主機所在實體網路。由於雲節點本身沒有對外的連線必須從雲節點拉線連到每一台設備或先連到頂層路由器再依靠既有路由達到其餘設備。接著登入每一台設備在對應雲端接入的介面上執行以下 IOS 指令改用 DHCP 取得家庭網路的 IPenable config t int gi0/0 ip add dhcp no sh exit exit sh ip int br最後一條show ip interface brief會顯示從家庭網路 DHCP 取得的位址。完成後設備的位址對照如下左欄為 EVE-NG 內部網段右欄為家庭網路段NodeIP AddressHome Network IPRouter10.10.88.110192.168.169.115Switch110.10.88.111192.168.169.178Switch210.10.88.112192.168.169.193Switch310.10.88.113192.168.169.125Switch410.10.88.114192.168.169.197至此工作站即可直接對這些家庭網路 IP 發起 SSH 連線。注意此處使用的家庭網段192.168.169.0/24僅為本文範例環境實作時應替換為你自己家庭網路的實際網段與 DHCP 指派結果。3. 用 SSH 取代 Telnet加密通道存取網路設備傳統網路管理常使用 Telnet但 Telnet 的明文傳輸會讓設備的帳號密碼與配置在網路中被竊聽。SSH 在用戶端與設備之間建立加密通道是現代網路設備管理的標準方式。SSH 的概念在 Linux 章節的 Day 18 已有介紹。在家庭網路 IP 就緒後工作站可以使用任一 SSH 用戶端連線設備本文使用PuTTY也可使用Git Bash等內建ssh命令的終端。下圖為 SSH 登入路由器 R1192.168.169.115後的畫面提示符R1代表成功進入用戶模式手動 SSH 連線適合單台設備的臨時操作但當設備數量一多逐台登入執行指令既費時又容易出錯——這正是接下來 Python 自動化的切入點。4. 用 Python Netmiko 批量收集設備資訊4.1 腳本全貌與逐段解說第一個自動化場景是「連線每一台設備執行show ip int brief收集所有介面配置與狀態」。原始碼位於 netmiko_con_multi.py#!/usr/bin/env python from netmiko import ConnectHandler from getpass import getpass #password getpass() R1 { device_type: cisco_ios, host: 192.168.169.115, username: admin, password: access123, } SW1 { device_type: cisco_ios, host: 192.168.169.178, username: admin, password: access123, } SW2 { device_type: cisco_ios, host: 192.168.169.193, username: admin, password: access123, } SW3 { device_type: cisco_ios, host: 192.168.169.125, username: admin, password: access123, } SW4 { device_type: cisco_ios, host: 192.168.169.197, username: admin, password: access123, } command show ip int brief for device in (R1, SW1, SW2, SW3, SW4): net_connect ConnectHandler(**device) print(net_connect.find_prompt()) print(net_connect.send_command(command)) net_connect.disconnect()逐段解說from netmiko import ConnectHandler引入 Netmiko 的核心連線類別。ConnectHandler接受一個設備參數字典並回傳對應廠商的連線物件。設備字典每個設備以一個 Python dict 描述包含四個欄位device_type設備類型。cisco_ios表示 Cisco IOS 平台Netmiko 會據此選擇正確的指令提示符解析與互動方式host設備的 IP 位址此處為前面取得的家庭網路 IPusername/password登入憑據。腳本中被註解掉的password getpass()提示了更安全的做法——改為執行時互動輸入避免把密碼寫死在程式碼中。範例中的admin/access123是 EVE-NG 實驗環境的示範憑據真實環境應使用獨立帳號與機密管理機制。ConnectHandler(**device)以**展開字典作為關鍵字參數建立連線內部即使用 SSH。find_prompt()回傳目前設備的提示符例如R1#可確認確實登入了預期設備。send_command(command)在設備上執行指令並回傳輸出文字。此處執行show ip int brief取得介面摘要。disconnect()關閉 SSH 連線避免資源洩漏。執行結果如下圖可以看到 5 台設備R1 SW1SW4的介面資訊依序被列印出來這種「一份腳本、集中檢視」的做法在設備眾多時特別有用把設備清單集中在一個 dict 結構中即可在單一位置掌握所有設備的介面狀態快速比對與排錯。5. 用 Python 批量下發配置trunk 埠自動化收集資訊之外自動化更大的價值在於批量修改配置。以SW1與SW2之間的 trunk 埠為例——若要在成百上千台交換機上重複設定 trunk手動逐台連線既慢又容易漏改應改由腳本一次完成。5.1 下發 trunk 配置原始碼位於 netmiko_sendchange.pyfrom netmiko import ConnectHandler SW2 { device_type: cisco_ios, host: 192.168.169.193, username: admin, password: access123, secret: access123, } core_sw_config [int range gig0/1 - 2, switchport trunk encapsulation dot1q, switchport mode trunk, switchport trunk allowed vlan 1,2] print(########## Connecting to Device {0} ############.format(SW2)) net_connect ConnectHandler(**SW2) net_connect.enable() print(***** Sending Configuration to Device *****) net_connect.send_config_set(core_sw_config)與收集腳本的差異點secret: access123enable 密碼。enable()方法會以該密碼將設備從用戶模式提升到特權模式這是執行configure terminal類指令的必要前提。core_sw_config以清單形式描述待下發的配置片段對應 IOS 下int range gig0/1 - 2、switchport trunk encapsulation dot1q、switchport mode trunk、switchport trunk allowed vlan 1,2四個指令表示將 gi0/1gi0/2 設為 802.1Q trunk 並允許 VLAN 1、2 通行。send_config_set(...)Netmiko 會自動進入config t模式逐條執行清單中的指令後退出配置模式——這正是 Netmiko 對比原始 Paramiko 的便利之處不需自行處理模式切換與提示符等待。5.2 用第二支腳本驗證配置結果原文件也誠實指出send_config_set只會印出sending configuration to device並未回傳配置是否生效的確認。因此在 netmiko_con_multi_vlan.py 中改以show int trunk驗證 trunk 埠狀態#!/usr/bin/env python from netmiko import ConnectHandler from getpass import getpass #password getpass() SW1 { device_type: cisco_ios, host: 192.168.169.178, username: admin, password: access123, } SW2 { device_type: cisco_ios, host: 192.168.169.193, username: admin, password: access123, } SW3 { device_type: cisco_ios, host: 192.168.169.125, username: admin, password: access123, } SW4 { device_type: cisco_ios, host: 192.168.169.197, username: admin, password: access123, } command show int trunk for device in (SW1, SW2, SW3, SW4): net_connect ConnectHandler(**device) print(net_connect.find_prompt()) print(net_connect.send_command(command)) net_connect.disconnect()此腳本結構與收集腳本一致只是把command換成show int trunk並且只遍歷 4 台交換機。下圖為執行結果可看到SW1、SW2的 trunk 埠已列出允許的 VLAN1、2與 trunk 狀態印證了前述下發的配置確實生效由此形成一個完整的**「下發配置 → 回讀驗證」**閉環先以send_config_set批量變更再以send_command回讀關鍵輸出確保變更符合預期。對照原文件所言這正是實戰中建議補上的檢查與驗證步驟。6. 自動化備份設備配置網路設備的配置檔是重要的資產理應定期備份。備份場景同樣不該逐台登入可以完全交給 Python 腳本完成。6.1 備份腳本與 IP 清單備份腳本位於 backup.py它是基於Paramiko而非 Netmiko的實現並搭配 backup.txt 存放待備份設備的 IP 清單import sys import time import paramiko import os import cmd import datetime now datetime.datetime.now() dt_string now.strftime(%d/%m/%Y %H:%M:%S) print(Your backup has started at, dt_string) tic time.perf_counter() #user input(Enter username:) #password input(Enter Paswd:) #enable_password input(Enter enable pswd:) user admin password access123 enable_password access123 port22 f0 open(backup.txt) for ip in f0.readlines(): ip ip.strip() filename_prefix /Users/shambhu/Documents ip ssh paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip,port, user, password, look_for_keysFalse) chan ssh.invoke_shell() time.sleep(2) chan.send(enable\n) chan.send(enable_password \n) time.sleep(1) chan.send(term len 0\n) time.sleep(1) chan.send(sh run\n) time.sleep(20) output chan.recv(999999) filename %s_%.2i%.2i%i_%.2i%.2i%.2i % (ip,now.year,now.month,now.day,now.hour,now.minute,now.second) f1 open(filename, a) f1.write(output.decode(utf-8) ) f1.close() ssh.close() f0.close() toc time.perf_counter() print(Congratulations You Have Backed Up Your 90DaysOfDevOps Lab) print(fYour backup duration was {toc - tic:0.4f} seconds) dt_string now.strftime(%d/%m/%Y %H:%M:%S) print(Your backup completed at, dt_string)備份流程解析backup.txt是設備清單檔內容即前面 5 台設備的家庭網路 IPbackup.txt192.168.169.115 192.168.169.178 192.168.169.193 192.168.169.125 192.168.169.197paramiko.SSHClient()set_missing_host_key_policy(paramiko.AutoAddPolicy())建立 SSH 用戶端並自動接受未知主機金鑰實驗環境適用正式環境建議使用RejectPolicy以降低中間人風險。ssh.connect(ip, port, user, password, look_for_keysFalse)建立 SSH 連線。invoke_shell()啟動互動式 shell此後用chan.send(...)逐條送入enable、enable 密碼、term len 0關閉分頁、sh run輸出完整運行配置。chan.recv(999999)收取指令輸出此處因實驗設備量少直接讀取大量設備時建議改為依序等待每條指令的輸出。檔案命名filename以IP_年月日_時分秒格式組成。備份檔預設寫入腳本執行所在的目前目錄open(filename, a)未指定路徑腳本中註解掉的filename_prefix /Users/shambhu/Documents ip則提示了自訂輸出目錄的擴充方向。6.2 備份結果實證執行備份腳本後目前工作目錄會產生 5 個以設備 IP 命名的備份檔。下圖顯示執行完畢後以ls檢視目錄的結果藍框中的檔案即各設備的配置備份與此對應Networking 目錄 中也保留了實際運行備份的產物例如 192.168.169.115_20220127_145846檔名即R1的 IP 加上2022/01/27 14:58:46時間戳。該檔內容開頭為R1enable、term len 0、sh run的互動記錄與完整配置輸出直接印證了上述備份流程在真實執行時的輸出樣貌。連同 192.168.169.125_20220127_145846、192.168.169.178_20220127_145846 等檔案可以清楚看出「一台設備、一份時間戳備份」的成果。腳本最後以perf_counter統計備份耗時並列印開始/完成時間方便日誌追蹤。7. 兩大 SSH 程式庫Paramiko 與 Netmiko7.1 Paramiko通用的 SSH 底層套件Paramiko 是 Python 社群最廣泛使用的 SSH 實作模組提供低階但完整的 SSH 能力連線、通道、SFTP 等。安裝方式pip install paramiko安裝完成後可在 Python 互動式 shell 中驗證import paramiko參照 paramiko_show.py可以看到 Paramiko 的另一種典型用法——不使用invoke_shell而是直接對設備送指令並讀取輸出#!/usr/bin/python import paramiko import time Channel paramiko.SSHClient() Channel.set_missing_host_key_policy(paramiko.AutoAddPolicy()) Channel.connect(hostname192.168.169.115, usernameadmin, passwordaccess123, look_for_keysFalse, allow_agentFalse) shell Channel.invoke_shell() # This will set interactive shell shell.send(enable\n) shell.send(access123\n) shell.send(terminal length 0\n) shell.send(show ip int b\n) shell.send(show arp \n) time.sleep(2) print(shell.recv(5000)) # This will receive everything from the buffer, if you need to receive specifc output, the you should execute the command # and immediately receive the output before executing the 2nd command, Also you should sleep a little Channel.close()此範例展示了幾項實戰要點allow_agentFalse關閉 SSH agent 驗證明確使用程式內提供的帳密。invoke_shell()建立互動式 shell 後以send()依序送入enable、enable 密碼、terminal length 0與查詢指令由於是互動通道必須用time.sleep()等待設備回應再以recv()讀取緩衝區內容。註解特別提醒若要精確取得單一指令輸出應逐條執行並立即收取輸出再執行下一條指令避免多條指令輸出混在一起。7.2 Netmiko專為網路設備打造的更高層封裝與通用的 Paramiko 相比Netmiko 是專門針對網路設備設計的模組它內建各家廠商的指令提示符、enable 模式進入方式與指令處理邏輯讓工程師用更少的程式碼完成「連線、下指令、收輸出、斷線」的完整流程。安裝方式同樣簡單pip install netmiko從本文的實例可以清楚看到兩者的分工與層次面向ParamikoNetmiko定位通用 SSH 連線底層網路設備專用的 SSH 高層封裝典型應用自訂互動流程如 backup.py 逐條 send/recv依device_type自動處理廠商差異如send_command/send_config_set程式碼量需自行處理提示符、sleep 與模式切換封裝後一行即可下發配置學習成本低階、靈活、可控性高對網管任務更友好兩者並非互斥Netmiko 內部亦以 Paramiko 作為 SSH 傳輸層實務上可依任務粒度選擇——需要細粒度掌控互動流程時用 Paramiko需要快速完成設備查詢/配置任務時用 Netmiko。8. 其他值得關注的網路自動化輔助模組除了 SSH 相關套件原文件還推薦兩個在網路自動化中高頻使用的輔助模組netaddr用於 IP 位址與網段的運算與操作子網路劃分、位址比對、CIDR 計算等可讓腳本在批量處理設備 IP、VLAN 網段時避免手動字串處理的錯誤。安裝指令pip install netaddrxlrd用於讀取 Excel 工作簿.xls可將試算表中的列與欄轉換為矩陣資料。當你習慣把大量交換機的配置參數設備名、IP、VLAN 規劃維護在 Excel 時xlrd可讓 Python 腳本直接讀取該表並作為自動化輸入。安裝指令pip install xlrd這兩個模組展示了網路自動化的常見組合拳Netmiko/Paramiko 負責「怎麼連、怎麼下指令」netaddr/xlrd 負責「資料從哪來、怎麼算」再加上前面章節的批量收集與備份腳本即可拼出一個接近實戰的網路自動化雛形。9. 小結Day 27 為 #90DaysOfDevOps 的網路章節畫下句點核心收穫可濃縮為以下四點以 SSH 加密通道取代 Telnet存取網路設備並透過 EVE-NG 的 Management Cloud 將虛擬設備橋接至家庭網路讓工作站可直接管理。Netmiko 批量收集netmiko_con_multi.py一份設備字典 迴圈集中取得所有設備的介面狀態。Netmiko 批量下發配置並回讀驗證netmiko_sendchange.py 與 netmiko_con_multi_vlan.pysend_config_set下發 trunk 配置show int trunk驗證生效。Paramiko 自動化備份backup.py backup.txt按 IP 清單批量sh run並以「IP_時間戳」命名備份檔。從device_type、secret、send_config_set到invoke_shell本文的每個程式片段都可在 Networking 目錄 中找到對應原始檔與真實執行產物含 5 份備份檔適合直接拿來做為實驗室的起點。接下來的旅程將進入雲端運算主題Day 28為後續的基礎設施自動化建立知識基礎。赞分享文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载相关推荐Synaptic 繁體中文實戰指南以架構無關的神經網路庫在 Node.js 與瀏覽器建構、訓練與比較網路Synaptic 繁體中文實戰指南以架構無關的神經網路庫在 Node.js 與瀏覽器建構、訓練與比較網路 Synaptic 是一套同時支援 node.js 與机器学习深度学习90DaysOfDevOps 网络自动化实战用 Python Netmiko 管理 EVE-NG 虚拟网络设备90DaysOfDevOps 网络自动化实战用 Python Netmiko 管理 EVE NG 虚拟网络设备 本篇是 90DaysOfDevOps 网络文档/教程90DaysOfDevOps 网络自动化实战用 Python Netmiko/Paramiko 管理 EVE-NG 仿真设备Day 2790DaysOfDevOps 网络自动化实战用 Python Netmiko/Paramiko 管理 EVE NG 仿真设备Day 27 本文对应 9文档/教程上一篇Vue巨树组件完整教程轻松驾驭海量数据的高性能树形组件下一篇医疗影像数据处理难题的DCMTK解决方案从DICOM解析到临床应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑