絡自動化實戰(zhàn)(Day 27):用 Python + Netmiko/Paramiko 批量采集、配置與備份網(wǎng)絡設備)
文檔/教程【免費下載鏈接】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 計算機網(wǎng)絡系列的最后一天實戰(zhàn)篇承接 Day 26 在 EVE-NG 中搭建的「1 臺 Cisco vIOS 路由器 4 臺 Cisco vIOS 交換機」仿真 lab聚焦用 Python 對網(wǎng)絡設備做自動化。讀完本文你將掌握通過 SSH 批量采集多臺設備接口信息、自動下發(fā)配置如 trunk 配置、自動備份設備配置并理解 Paramiko 與 Netmiko 這兩大 Python SSH 庫的定位差異與典型用法。文中所有腳本都來自倉庫 2022/Days/Networking 目錄可直接對照學習。一、環(huán)境回顧與前置準備1.1 上一講的 Lab 拓撲與地址表Day 26 在 EVE-NG 中創(chuàng)建了 5 臺設備1 臺 Cisco vIOS 路由器R1充當網(wǎng)關4 臺 Cisco vIOS 二層交換機SW1~SW4互聯(lián)。每臺設備在仿真內網(wǎng)10.10.88.0/24中的管理地址如下Node仿真內網(wǎng) IPRouter10.10.88.110Switch110.10.88.111Switch210.10.88.112Switch310.10.88.113Switch410.10.88.114各設備的初始配置腳本保存在倉庫 2022/Days/Networking 下R1、SW1、SW2、SW3、SW4內容均開啟 SSHip ssh version 2、啟用本地認證username admin password access123、設置 enable 密碼enable password access123并開啟 LLDP 與 SNMP為后續(xù)自動化通信做好了準備。1.2 讓設備接入宿主機的管理網(wǎng)絡Management Cloud自動化腳本要從宿主機直接訪問這些設備因此需要讓仿真拓撲與宿主機網(wǎng)絡打通。操作如下在 EVE-NG 拓撲畫布上右鍵 → Network → 選擇 Management(Cloud0)這會在拓撲中創(chuàng)建一個連接到宿主機的新網(wǎng)絡對應本講 Day27_Networking3.png 右側云圖標所表示的 Home Network。依次進入每臺設備在其連接該 Management 網(wǎng)絡的接口gi0/0上執(zhí)行以下命令讓該接口通過 DHCP 從宿主機網(wǎng)絡自動獲取 IPenable config t int gi0/0 IP add DHCP no sh exit exit sh ip int br執(zhí)行完成后每臺設備除了仿真內網(wǎng)地址外還會獲得一個 Home Network 段的地址用于宿主機 SSH 訪問Node仿真內網(wǎng) IPHome 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提示如果網(wǎng)絡經(jīng)驗有限也可以先把 Router 與各 Switch 連好再由 Router 作為網(wǎng)關連通外部網(wǎng)絡本講按「每臺設備直接接入 Management(Cloud0)」的方式演示邏輯最直觀。1.3 從宿主機 SSH 驗證連通性拿到地址后即可用任意 SSH 客戶端如 Windows 上的 Putty從宿主機連接設備。本講以 Putty 為例通過 192.168.169.115 連接 R1登錄后即可進入 Cisco IOS 命令行。二、方案一Paramiko —— 通用 SSH 庫2.1 什么是 ParamikoParamiko 是 Python 生態(tài)中最廣泛使用的原生 SSH 實現(xiàn)之一它實現(xiàn)了 SSHv2 協(xié)議提供客戶端連接、通道channel、密鑰交換、SFTP 等能力不依賴任何外部 SSH 程序適合對任意支持 SSH 的主機做底層交互。安裝只需一行命令pip install paramiko安裝后可以在 Python 交互環(huán)境中驗證導入是否成功import paramiko2.2 用 Paramiko 采集設備信息倉庫中的 paramiko_show.py 演示了 Paramiko 的典型用法建立 SSH 客戶端、自動接受主機密鑰、登錄后打開交互式 shell 通道逐條發(fā)送命令并接收輸出#!/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)) # 需要精確獲取某條命令輸出時應先發(fā)送命令并立即讀取再發(fā)下一條兩條命令之間建議加一點 sleep Channel.close()關鍵點解讀set_missing_host_key_policy(paramiko.AutoAddPolicy())自動接受未在 known_hosts 中出現(xiàn)過的主機公鑰實驗環(huán)境用很方便invoke_shell()創(chuàng)建交互式偽終端通道可以像人坐在 console 前一樣連續(xù)發(fā)送命令、處理enable密碼等狀態(tài)變化look_for_keysFalse, allow_agentFalse明確不使用本機密鑰與 ssh-agent而是用腳本內給定的用戶名密碼登錄由于通道是交互式的命令輸出是異步返回的因此發(fā)送命令后要time.sleep()等待再recv()讀取緩沖區(qū)。三、方案二Netmiko —— 面向網(wǎng)絡設備的封裝庫3.1 Netmiko 與 Paramiko 的分工Paramiko 是通用 SSH 庫而Netmiko 專門面向網(wǎng)絡設備在 Paramiko 之上封裝了對 Cisco、Juniper、Arista、華為、H3C 等眾多廠商設備的適配層自動處理各廠商特有的登錄提示、分頁符--More--、enable/特權模式、命令回顯等差異讓腳本只需寫設備類型與命令本身。安裝命令pip install netmikoNetmiko 對廠商設備的支持列表可在其官方倉庫的 Supports 章節(jié)查閱。3.2 用 Netmiko 批量采集多臺設備接口信息倉庫 netmiko_con_multi.py 是「一次運行、連接全部設備」的示例把每臺設備抽象成一個 Python 字典device_type、host、username、password循環(huán)建立連接、發(fā)送命令、打印輸出#!/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()運行后會依次打印 R1、SW1~SW4 的設備提示符如R1#以及show ip int brief的接口匯總接口名、IP、OK 狀態(tài)、獲取方式、接口狀態(tài)、協(xié)議狀態(tài)。腳本開頭保留了getpass()的注釋寫法生產(chǎn)環(huán)境更推薦用交互式輸入密碼避免把口令硬編碼進腳本。find_prompt()返回當前設備提示符用于確認已登錄并處于正確模式send_command(command)發(fā)送一條 show 命令并等待完整輸出返回Netmiko 會自動處理分頁disconnect()斷開連接釋放資源。如果設備數(shù)量很多這種「設備字典 循環(huán)」模式可以讓你集中管理、一次運行查看所有配置非常利于快速巡檢。四、用 Python 下發(fā)配置trunk 自動化4.1 場景批量把端口配置為 trunk上一講提到 SW1 與 SW2 之間有一條 trunk 鏈路。若手動逐臺 SSH 配置既慢又易錯自動化則可以一條腳本同時改多臺交換機。倉庫 netmiko_sendchange.py 演示了向 SW2 下發(fā)一組 trunk 配置from 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字段這是 enable/特權模式的密碼配合net_connect.enable()進入特權模式真實設備上請使用與enable password一致的密碼send_config_set([...])接收一個配置命令列表Netmiko 會依次進入配置模式、逐條下發(fā)、再退出一條腳本即可完成成組配置配置命令int range gig0/1 - 2進入一組接口→switchport trunk encapsulation dot1qtrunk 封裝→switchport mode trunktrunk 模式→switchport trunk allowed vlan 1,2允許 VLAN 1 與 2 通過。注意腳本打印了sending configuration to device字樣但這只是「正在發(fā)送」的提示并不代表配置已生效。生產(chǎn)使用時應補充驗證環(huán)節(jié)。4.2 驗證配置結果批量查詢 trunk 狀態(tài)為確認配置真實生效可復用「設備字典 循環(huán)」模式把命令換成show int trunk。倉庫 netmiko_con_multi_vlan.py 正是這樣做的——遍歷 SW1~SW4 執(zhí)行show int trunk輸出每臺交換機 Trunk 口的模式、封裝、狀態(tài)、本征 VLAN、允許通過的 VLAN 以及生成樹中處于轉發(fā)狀態(tài)未阻塞的 VLAN用于核驗配置是否成功下發(fā)#!/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()這樣「下發(fā)配置 → 批量驗證」兩段式流程構成了網(wǎng)絡自動化最基礎的閉環(huán)先改、再查、確保生效。五、用 Python 備份設備配置除了采集與配置配置備份也是網(wǎng)絡運維的高頻需求。倉庫 backup.py 用 Paramiko 實現(xiàn)了一個可運行的備份腳本從文本文件讀取目標 IP 列表逐臺 SSH 登錄、進入 enable、執(zhí)行show run把回顯落盤為帶時間戳的文件并打印耗時統(tǒng)計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 port 22 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 中按行列出要備份的設備 IP192.168.169.115 192.168.169.178 192.168.169.193 192.168.169.125 192.168.169.197運行后終端會依次顯示備份開始時間、每臺設備的執(zhí)行過程、總耗時與完成時間隨后在腳本目錄下生成以IP_年月日_時分秒命名的備份文件。倉庫中已包含一次真實備份產(chǎn)物例如 192.168.169.115_20220127_145846內容為該設備的完整show running-config回顯可打開對照查看備份格式與內容。兩點改進建議示例中備份文件前綴filename_prefix變量在倉庫腳本中未實際使用文件直接寫在腳本所在目錄真實環(huán)境中建議用完整路徑把備份集中存放并考慮用getpass輸入憑據(jù)而不是硬編碼。六、擴展其他值得了解的自動化庫除了 Paramiko 與 Netmiko網(wǎng)絡自動化生態(tài)中還有兩個倉庫腳本未展開、但很常用的庫netaddr專門處理 IP 地址與子網(wǎng)計算的庫如地址解析、CIDR 運算、網(wǎng)段規(guī)劃安裝命令pip install netaddrxlrd用于讀取 Excel 文件的庫可以把多臺交換機配置等表格數(shù)據(jù)讀成矩陣便于批量驅動腳本安裝命令pip install xlrd。此外Netmiko 作者維護的 pynet 倉庫中還提供了更多網(wǎng)絡自動化示例如演示文稿配套代碼可作為后續(xù)深入學習的素材。七、總結一條腳本搞定「采配置、改配置、備配置」回顧本講圍繞 Day 26 的 EVE-NG 仿真網(wǎng)絡我們用 Python 完成了三類核心運維動作并且都在倉庫 2022/Days/Networking 中留有一一對應的可運行腳本運維動作核心腳本關鍵 API/手段批量采集接口信息netmiko_con_multi.pyConnectHandlersend_command批量下發(fā) trunk 配置netmiko_sendchange.pyenable()send_config_set驗證配置結果netmiko_con_multi_vlan.pysend_command(show int trunk)批量備份配置backup.py backup.txtParamikoinvoke_shellshow run選型建議追求廠商適配與開箱即用選 Netmiko它本身構建在 Paramiko 之上需要對 SSH 做底層精細控制SFTP、端口轉發(fā)、自定義通道選 Paramiko。兩者的組合例如 Netmiko 負責日常運維、Paramiko 處理備份等定制任務正是本講倉庫腳本呈現(xiàn)的典型分工。計算機網(wǎng)絡系列到此告一段落。Day 27 也標志著從「網(wǎng)絡原理」正式走向「網(wǎng)絡即代碼」的落地當設備規(guī)模從 5 臺擴展到成百上千臺時「集中控制 一次運行」的自動化腳本就是你最趁手的運維工具。下一站 Day 28 將進入云計算主題。參考資源Day 26 建 Lab 詳情2022/vi/Days/day26.md網(wǎng)絡自動化腳本與設備配置目錄2022/Days/Networking本講配圖Day27_Networking3.png、Day27_Networking6.png、Day27_Networking8.png贊分享文檔/教程【免費下載鏈接】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 實戰(zhàn)用 Python Netmiko/Paramiko 自動化 EVE-NG 網(wǎng)絡設備Day 2790DaysOfDevOps 實戰(zhàn)用 Python Netmiko/Paramiko 自動化 EVE NG 網(wǎng)絡設備Day 27 本篇以 90Days文檔/教程90DaysOfDevOps 網(wǎng)絡自動化實戰(zhàn)用 Python Netmiko/Paramiko 管理 EVE-NG 仿真設備Day 2790DaysOfDevOps 網(wǎng)絡自動化實戰(zhàn)用 Python Netmiko/Paramiko 管理 EVE NG 仿真設備Day 27 本文對應 9文檔/教程90DaysOfDevOps 第27天用 Python 與 Netmiko 實戰(zhàn)網(wǎng)絡設備自動化90DaysOfDevOps 第27天用 Python 與 Netmiko 實戰(zhàn)網(wǎng)絡設備自動化 本指南圍繞 90DaysOfDevOps 網(wǎng)絡基礎章節(jié)的收尾篇文檔/教程上一篇初識智能體從概念原理到 5 分鐘構建你的第一個 LLM Agenthello-agents 第一章實戰(zhàn)指南下一篇Universal Android Debloater深度評測為什么它能提升你的設備性能創(chuàng)作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考