身為網路工程師,我深知網路自動化的重要性。有效率的自動化管理能大幅降低人為錯誤,提升工作效率。本文將分享我多年累積的經驗,結合 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_REGEXPASSWORD_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 空間:

  1. 連線到路由器並取得 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 空間的程式碼執行流程。

  1. 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 升級前的準備工作,有效提升效率並降低錯誤風險。在我的實務經驗中,自動化指令碼大幅簡化了網路管理流程,讓我更專注於更重要的任務。