身為網路工程師,我深知網路自動化的重要性。有效率的自動化管理能大幅降低人為錯誤,提升工作效率。本文將分享我多年累積的經驗,結合 Python、Pandas 與 Netmiko,開發一個強大的自動化網路管理系統。
首先,我們需要一個安全的機制來驗證使用者身份。
使用正規表示式驗證使用者憑證
以下程式碼片段示範如何使用 Python 的正規表示式驗證使用者名稱和密碼:
import re
from getpass import getpass
# 正規表示式,用於驗證輸入模式
USERNAME_REGEX = re.compile(r'^[a-zA-Z0-9][a-zA-Z0-9_-]{3,28}[a-zA-Z0-9]$')
PASSWORD_REGEX = re.compile(r’^[a-zA-Z].{7,49}’)
def get_secret(pwd):
"""取得並驗證使用者 secret。"""
while True:
resp = input("密碼與 secret 是否相同? (y/n) : ").lower()
if resp in ("yes", "y"):
return pwd
elif resp in ("no", "n"):
while True:
secret = getpass("請輸入 secret : ")
if PASSWORD_REGEX.match(secret):
secret_verify = getpass("請確認 secret : ")
if secret == secret_verify:
return secret
else:
print("!!! secret 不符。請重新輸入。")
else:
print("!!! secret 格式錯誤。")
else:
print("!!! 輸入無效。")
def get_credentials():
"""取得並驗證使用者憑證。"""
while True:
uid = input("請輸入網路管理員 ID : ")
if USERNAME_REGEX.match(uid):
while True:
pwd = getpass("請輸入網路管理員密碼 : ")
if PASSWORD_REGEX.match(pwd):
pwd_verify = getpass("請確認網路管理員密碼 : ")
if pwd == pwd_verify:
return uid, pwd, get_secret(pwd)
else:
print("!!! 網路管理員密碼不符。請重新輸入。")
else:
print("!!! 密碼格式錯誤。")
else:
print("!!! 使用者名稱格式錯誤。")
uid, pwd, secret = get_credentials()
print("驗證成功!")
這段程式碼的核心在於使用 USERNAME_REGEX
和 PASSWORD_REGEX
兩個正規表示式,分別驗證使用者名稱和密碼的格式。get_secret()
函式確保使用者輸入的 secret 與密碼相符或獨立驗證。get_credentials()
函式則整合了使用者名稱、密碼和 secret 的取得與驗證流程,提升了程式碼的可讀性和安全性。我特別注重使用者經驗,加入了明確的錯誤提示,引導使用者正確輸入。
從 CSV 檔案讀取網路裝置資訊
驗證使用者身份後,我們需要從 CSV 檔案讀取網路裝置資訊。
import pandas as pd
try:
df = pd.read_csv("devices_info.csv")
print("裝置資訊:\n", df)
except FileNotFoundError:
print("找不到 devices_info.csv 檔案!")
exit()
這段程式碼使用 Pandas 讀取 devices_info.csv
檔案。我特別加入了 try-except
區塊,處理檔案不存在的例外狀況,使程式碼更穩健。
devices_info.csv 檔案範例
以下是一個 devices_info.csv
檔案的範例:
devicename,device,devicetype,host,newios,newiosmd5
c8kv01,RT,cisco_ios,192.168.127.111,c8000v-universalk9.17.06.05a.SPA.bin,13f0161a50210f2f21618fc59c5f5343
c8kv02,RT,cisco_ios,192.168.127.222,c8000v-universalk9.17.06.05a.SPA.bin,13f0161a50210f2f21618fc59c5f5343
建立 Netmiko 連線字典
最後,我們將 CSV 資料轉換為 Netmiko 連線字典。
device_list = []
for _, row in df.iterrows():
device = {
'device_type': row['devicetype'],
'host': row['host'],
'username': uid, # 使用驗證過的使用者名稱
'password': pwd, # 使用驗證過的密碼
'secret': secret, # 使用驗證過的 secret
}
device_list.append(device)
print("Netmiko 連線字典:\n", device_list)
這段程式碼迭代 DataFrame 的每一列,並建立一個包含裝置連線資訊的字典。我將驗證過的使用者名稱、密碼和 secret 加入字典,確保連線安全。
流程圖
graph LR B[B] A[驗證使用者憑證] --> B{讀取 CSV 檔案}; B --> C[建立 Netmiko 連線字典]; C --> D(自動化網路管理);
類別圖
classDiagram class Pandas{ read_csv() iterrows() } class Netmiko{ ConnectHandler() } Pandas -- Netmiko : 資料傳遞
透過以上步驟,我們成功地結合 Python、Pandas 和 Netmiko,實作了網路裝置資訊的自動化讀取和連線設定。這為更複雜的網路自動化任務奠定了堅實的基礎。未來,我將繼續探索更多網路自動化的技巧,並分享我的經驗。
身為一個在網路自動化領域浸淫多年的技術工作者,我發現有效管理大量網路裝置資訊是自動化成功的關鍵。這篇文章將分享我如何使用 Python 結合 Pandas 與 Netmiko 函式庫,從 CSV 檔案讀取裝置資訊,並執行自動化網路操作,包含連線到裝置、執行指令,以及驗證 IOS 映像檔的 MD5 值,確保升級過程的安全性。
CSV 檔案驅動的裝置管理
在實際專案中,我通常將網路裝置資訊儲存在 CSV 檔案中,這樣可以方便地管理和更新裝置資訊。以下程式碼示範如何使用 Pandas 讀取 CSV 檔案,並將資料轉換成 Netmiko 可用的格式:
import pandas as pd
from netmiko import ConnectHandler
df = pd.read_csv("devices_info.csv")
devices = []
for _, row in df.iterrows():
device = {
'device_type': row['device_type'],
'host': row['ip_address'],
'username': row['username'],
'password': row['password'],
'secret': row['secret'], # 若裝置需要 enable secret
}
devices.append(device)
for device in devices:
try:
with ConnectHandler(**device) as connection:
output = connection.send_command("show clock")
print(f"裝置 {device['host']}: {output}")
# 其他網路操作,例如 show version, show running-config 等
# ...
except Exception as e:
print(f"連線到裝置 {device['host']} 發生錯誤: {e}")
我使用 Pandas 的 read_csv
函式讀取 CSV 檔案,並利用迴圈迭代每一行資料,將其轉換成 Netmiko 可用的字典格式。with ConnectHandler(**device) as connection:
這個技巧可以確保連線在使用完畢後自動關閉,避免資源洩漏。此外,我加入了 try...except
區塊來處理連線過程中可能發生的錯誤,提升程式的穩定性。
IOS 映像檔 MD5 值驗證
在升級 IOS 映像檔之前,驗證其 MD5 值至關重要,這可以確保檔案的完整性。以下程式碼示範如何計算檔案的 MD5 值,並且預期的 MD5 值進行比較:
import hashlib
def verify_md5(filename, expected_md5):
hash_md5 = hashlib.md5()
with open(filename, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
hash_md5.update(chunk)
return hash_md5.hexdigest() == expected_md5
# 使用示例
filename = "c8000v-universalk9.17.06.05a.SPA.bin"
expected_md5 = "13f0161a50210f2f21618fc59c5f5343" # 從 CSV 檔案讀取或其他來源取得
if verify_md5(filename, expected_md5):
print(f"檔案 {filename} MD5 值驗證成功")
else:
print(f"檔案 {filename} MD5 值驗證失敗")
我設計了一個 verify_md5
函式,它接受檔名和預期的 MD5 值作為輸入。函式內部使用 hashlib
函式庫計算檔案的 MD5 值,並將其與預期的 MD5 值進行比較。為了避免一次性讀取整個檔案到記憶體,我使用了檔案分塊讀取的技巧,即使處理大型檔案也能保持效能。
視覺化呈現:流程與空間
以下使用 圖表展示整個流程和 Flash 空間的使用情況:
graph LR B[B] D[D] A[讀取 CSV 檔案] --> B{建立裝置連線}; B --> C[執行網路指令]; C --> D{驗證 IOS 映像檔}; D -- 成功 --> E[升級 IOS];
圖表説明: 這個流程圖清楚地展示了從讀取 CSV 檔案到升級 IOS 的整個流程。
pie title "Flash 空間使用率" "已用空間" : 60; "剩餘空間" : 40;
圖表説明: 這個餅圖直觀地呈現了 Flash 空間的使用情況,方便快速瞭解剩餘空間是否足夠。
透過結合 Python、Pandas 和 Netmiko,我們可以有效地管理網路裝置,並實作自動化網路操作。驗證 IOS 映像檔的 MD5 值和檢查 Flash 空間是確保升級過程順利進行的重要步驟。希望我的經驗分享能幫助大家提升網路自動化的效率和可靠性。
在升級 Cisco 路由器 IOS 之前,執行一些必要的準備工作至關重要,例如檢查 Flash 空間和備份執行組態。手動執行這些任務既費時又容易出錯。本文將介紹如何使用 Python 和 Netmiko 函式庫自動化這些流程,提升效率並降低風險。
檢查 Flash 空間
升級 IOS 之前,必須確認路由器上有足夠的 Flash 空間容納新的 IOS 映像檔。以下步驟説明如何使用 Python 和 Netmiko 檢查 Flash 空間:
- 連線到路由器並取得 Flash 空間資訊:
import time
from netmiko import ConnectHandler
import re
devices_list = [
{
'device_type': 'cisco_xe',
'host': '192.168.127.111',
'username': 'jdoe',
'password': 'cisco123',
'secret': 'cisco123'
},
{
'device_type': 'cisco_xe',
'host': '192.168.127.222',
'username': 'jdoe',
'password': 'cisco123',
'secret': 'cisco123'
}
]
for device in devices_list:
net_connect = ConnectHandler(**device)
net_connect.send_command("terminal length 0")
show_dir = net_connect.send_command("dir")
print("-" * 80)
time.sleep(2)
pattern = re.compile(r"\d+(?=\sbytes\sfree\))") # 使用正規表示式提取可用空間
match = pattern.findall(show_dir)
flash_free = (int(match[0]) / 1000000) # 將 bytes 轉換為 MB
print(f"路由器 {device['host']} 的可用 Flash 空間:{flash_free} MB")
這段程式碼使用 netmiko
連線到多台 Cisco XE 路由器。我選擇 netmiko
因為它簡化了 SSH 連線的管理,並提供方便的指令傳送和接收功能。程式碼首先建立一個包含路由器連線資訊的列表 devices_list
。接著,迴圈遍歷列表中的每個裝置,使用 ConnectHandler
建立 SSH 連線。透過 send_command("dir")
取得 Flash 空間資訊後,利用正規表示式 \d+(?=\sbytes\sfree\))
提取可用空間數值。這個正規表示式專門設計用來比對 “bytes free” 前的數字,確保提取的資料準確性。最後,將 bytes 轉換為 MB 並顯示結果。
graph LR B[B] A[建立 devices_list] --> B{迴圈遍歷裝置}; B --> C[建立 SSH 連線]; C --> D[執行 dir 命令]; D --> E[使用正規表示式提取可用空間]; E --> F[轉換單位並顯示];
**圖表説明:**此流程圖展示了檢查 Flash 空間的程式碼執行流程。
- Flash 空間不足時的處理:
如果 Flash 空間不足,則需要刪除舊的 IOS 映像檔或其他大型檔案。在我的經驗中,我會優先刪除舊的 IOS 映像檔,因為它們通常佔用相當大的空間。如果刪除後空間仍然不足,我會仔細分析 Flash 空間的使用情況,找出可以安全刪除的檔案,例如不再使用的組態備份或日誌檔。
備份執行組態
在升級 IOS 之前,備份當前的執行組態是一個重要的安全措施。以下是如何使用 Netmiko 備份組態:
for device in devices_list:
net_connect = ConnectHandler(**device)
net_connect.send_command("terminal length 0")
running_config = net_connect.send_command("show running-config")
# 將組態儲存到檔案
with open(f"{device['host']}_running_config.txt", "w") as f:
f.write(running_config)
print(f"路由器 {device['host']} 的執行組態已備份。")
這段程式碼同樣迴圈遍歷 devices_list
中的每個裝置,使用 show running-config
命令取得執行組態。為了確保取得完整的組態資訊,我使用 net_connect.send_command("terminal length 0")
停用分頁輸出。接著,使用 with open(...)
將組態內容寫入檔案,檔案名稱包含路由器的 IP 位址,方便日後識別。
sequenceDiagram participant User participant Netmiko participant Router User->>Netmiko: 建立連線 activate Netmiko Netmiko->>Router: show running-config activate Router Router-->>Netmiko: 執行組態 deactivate Router Netmiko->>User: 儲存組態到檔案 deactivate Netmiko
**圖表説明:**此序列圖描述了備份執行組態的流程,展現了使用者、Netmiko 和路由器之間的互動。
透過以上步驟,我們可以利用 Python 和 Netmiko 自動化 IOS 升級前的準備工作,有效提升效率並降低錯誤風險。在我的實務經驗中,自動化指令碼大幅簡化了網路管理流程,讓我更專注於更重要的任務。