身為一個網路工程師,我深知在管理大量網路裝置時,手動更新 IOS 檔案是多麼繁瑣與容易出錯的工作。因此,自動化 IOS 檔案的上傳和驗證就顯得至關重要。我將分享我如何利用 Python 和 Netmiko 開發一個高效能的自動化解決方案。

平行上傳與驗證:提升效率的關鍵

我的設計核心是利用 Netmiko 的強大功能和 Python 的多執行緒技術,實作 IOS 檔案的平行上傳和驗證。這能大幅縮短操作時間,尤其在同時處理多台裝置時,效率提升尤為明顯。

Python 自動化指令碼:md5_verify.py

以下是我精心設計的 Python 指令碼 md5_verify.py,它融合了多執行緒和錯誤處理機制,確保操作的穩定性和可靠性:

from netmiko import ConnectHandler, NetMikoTimeoutException
import threading
import re
import hashlib

# 設定 IOS 檔案資訊
IOS_FILENAME = "c8000v-universalk9.17.06.05a.SPA.bin"  # 使用正式的 IOS 檔案名稱
IOS_MD5 = "13f0161a50210f2f21618fc59c5f5343"  # 正式 IOS 檔案的 MD5 值

# 設定網路裝置資訊
DEVICES = [
    {
        'device_type': 'cisco_ios',
        'host': '192.168.127.111',
        'username': 'jdoe',
        'password': 'cisco123',
        'secret': 'cisco123',  # 若使用 enable secret,則需設定此項
        'fast_cli': False,  # 部分情況下關閉 fast_cli 可以提升穩定性
    },
    {
        'device_type': 'cisco_ios',
        'host': '192.168.127.222',
        'username': 'jdoe',
        'password': 'cisco123',
        'secret': 'cisco123',
        'fast_cli': False,
    },
]

# ... (其餘程式碼與前一版本類別似,但使用 IOS_FILENAME 和 IOS_MD5 變數)

程式碼解密:

  1. 模組匯入: 匯入 netmikothreadingrehashlib 等必要模組。
  2. 檔案資訊設定: 定義 IOS_FILENAMEIOS_MD5 變數,儲存 IOS 檔案名稱和其 MD5 值。
  3. 裝置資訊設定:DEVICES 列表中定義每個裝置的連線引數,包含 IP 位址、帳號密碼等。
  4. verify_ios 函式: 此函式負責連線到裝置、檢查檔案、計算 MD5 並驗證。我強化了錯誤處理,能更有效地應對網路中斷等異常狀況。
  5. 多執行緒處理: 使用 threading 模組,讓多台裝置的驗證工作同步進行,大幅提升效率。

流程圖:視覺化程式流程

  graph LR
    A[開始] --> B{連線裝置}
    B -- 成功 --> C{檢查檔案}
    C -- 存在 --> D{計算 MD5}
    D --> E{比較 MD5}
    E -- 比對 --> F[驗證成功]
    E -- 不比對 --> G[驗證失敗]
    B -- 失敗 --> H[連線失敗]
    C -- 不存在 --> I[檔案不存在]
    F --> J[結束]
    G --> J
    H --> J
    I --> J

這個流程圖清晰地展現了程式碼的執行邏輯,方便理解和維護。

網路中斷處理:提升程式碼的強健性

我特別加入了網路中斷處理機制,即使部分裝置無法連線,程式也能繼續執行,並清楚地報告錯誤資訊。這對於在複雜網路環境中進行自動化操作至關重要。

使用正式 IOS 檔案升級:貼近實際應用

我示範瞭如何使用正式的 IOS 檔案進行升級測試,並強調了計算和驗證 MD5 值的重要性,確保檔案的完整性和安全性。

玄貓的思考:追求卓越的網路自動化

我認為,網路自動化不只是簡單地將手動任務轉換成指令碼,更需要考量程式碼的效率、穩定性和可維護性。我的設計理念是開發一個真正實用與強健的自動化方案,讓網路管理更輕鬆、更可靠。

結論:邁向智慧網路管理

這個經過最佳化的指令碼,有效提升了 IOS 檔案上傳和驗證的效率和可靠性。它展示瞭如何結合 Netmiko 和多執行緒技術,實作更強大的網路自動化功能,為邁向智慧網路管理奠定堅實的基礎。

在網路自動化領域中妥善處理例外狀況和錯誤是至關重要的本文將探討如何增強先前的 Cisco IOS-XE 裝置升級工具使其具備更強大的錯誤處理能力

## 強化錯誤處理機制

先前的程式碼在錯誤處理方面存在不足例如 Netmiko 連線失敗時程式會直接終止而沒有提供更詳細的錯誤資訊我們可以改進這一點讓程式碼更具容錯性

```python
from netmiko import ConnectHandler, NetMikoTimeoutException, NetMikoAuthenticationException
import threading
import time

# ... (裝置資訊) ...

def reload_device(device):
    try:
        net_connect = ConnectHandler(**device)
        # ... (升級操作) ...
        net_connect.disconnect()
    except NetMikoTimeoutException:
        print(f"連線到 {device['host']} 超時。")
    except NetMikoAuthenticationException:
        print(f"驗證失敗:{device['host']}")
    except Exception as e:
        print(f"在 {device['host']} 上發生錯誤:{e}")

# ... (其他程式碼) ...

這段程式碼使用了 try...except 區塊來捕捉不同型別的例外狀況。針對連線超時和驗證失敗,分別使用 NetMikoTimeoutExceptionNetMikoAuthenticationException 進行處理,並印出更具體的錯誤訊息。Exception as e 則捕捉其他未預期的錯誤。

處理檔案傳輸錯誤

在檔案傳輸過程中,也可能出現錯誤,例如檔案不存在或傳輸中斷。我們可以加入程式碼來處理這些情況。

def transfer_file(device, file_path):
    try:
        with ConnectHandler(**device) as net_connect:
            # ... (檔案傳輸操作) ...
    except FileNotFoundError:
        print(f"找不到檔案:{file_path}")
    except Exception as e:
        print(f"在 {device['host']} 上傳輸檔案時發生錯誤:{e}")

# ... (其他程式碼) ...

這段程式碼使用 FileNotFoundError 來處理檔案不存在的錯誤。同樣地,Exception as e 捕捉其他可能的錯誤。使用 with ConnectHandler(...) as net_connect: 確保連線在使用後自動關閉。

顯示更豐富的除錯資訊

為了更有效地除錯,我們可以在程式碼中加入更多除錯資訊,例如裝置的回應訊息。

def reload_device(device):
    try:
        with ConnectHandler(**device) as net_connect:
            # ... (升級操作) ...
            output = net_connect.send_command("show version")
            print(f"{device['host']} 的版本資訊:\n{output}")
            # ... (其他操作) ...
    # ... (錯誤處理) ...

這段程式碼在升級過程中,使用 send_command("show version") 取得裝置的版本資訊,並印出到控制枱。這有助於追蹤升級過程和確認升級結果。

錯誤處理流程

  graph LR
A[開始] --> B{嘗試連線};
B -- 成功 --> C[執行升級];
C --> D[完成];
B -- 超時 --> E[記錄超時錯誤];
B -- 驗證失敗 --> F[記錄驗證錯誤];
B -- 其他錯誤 --> G[記錄錯誤];
E --> D;
F --> D;
G --> D;

圖表説明: 此流程圖展示了錯誤處理流程,包括嘗試連線、執行升級,以及處理不同型別的錯誤。

透過強化錯誤處理機制,並加入更豐富的除錯資訊,可以大幅提升網路自動化工具的穩定性和可靠性。這對於管理大量網路裝置尤其重要,可以有效減少人工干預和排查錯誤的時間。

在網路裝置升級後,驗證組態是否正確至關重要。手動驗證不僅耗時費力,而與容易出錯。根據多年網路自動化的經驗,我發現自動化指令碼可以有效解決這個問題。本文將分享我如何使用 Python 和 Netmiko 撰寫自動化指令碼,實作 Cisco IOS-XE 裝置升級後的自動驗證。

首先,我們需要使用 Netmiko 連線到裝置並取得裝置的時鐘資訊,這可以作為一個初步的連線測試。

from netmiko import ConnectHandler

device1 = {
    'device_type': 'cisco_ios',
    'host': '192.168.1.1',  # 替換為您的裝置 IP
    'username': 'your_username',  # 替換為您的使用者名稱
    'password': 'your_password',  # 替換為您的密碼
}
device2 = {
    'device_type': 'cisco_ios',
    'host': '192.168.1.2',  # 替換為您的裝置 IP
    'username': 'your_username',  # 替換為您的使用者名稱
    'password': 'your_password',  # 替換為您的密碼
}
devices_list = [device1, device2]

for device in devices_list:
    try:
        net_connect = ConnectHandler(**device)
        show_clock = net_connect.send_command("show clock")
        print(f"{device['host']}: {show_clock}")
        net_connect.disconnect()
    except Exception as e:
        print(f"連線到 {device['host']} 發生錯誤: {e}")

這段程式碼的核心在於利用 Netmiko 的 ConnectHandler 建立與 Cisco IOS-XE 裝置的 SSH 連線。我特意使用 try...except 區塊來捕捉潛在的連線錯誤,例如認證失敗或網路問題,確保指令碼的穩健性。透過迴圈迭代 devices_list,可以一次性檢查多台裝置,提高效率。net_connect.disconnect() 確保每次連線後都釋放資源,避免資源洩漏。show clock 命令用於驗證裝置的基本連線和回應能力。

接著,為了確保裝置在重啟後可以正常連線,我設計了一個函式來監控連線埠 22 的狀態,並在連線埠開啟後執行後續的檢查。

import socket
import time
from netmiko import ConnectHandler

# ... (裝置連線資訊與 devices_list 保持不變)

def isOpen(ip, port):
    """檢查指定 IP 和連線埠是否開啟。"""
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.settimeout(3)
        try:
            s.connect((ip, int(port)))
            return True
        except Exception:
            return False


def post_reload_check(device, retry=60, delay=10):
    """在裝置重啟後檢查連線埠 22 並執行組態驗證。"""
    ip = str(device['host'])
    port = 22
    start_time = time.time()
    for i in range(retry):
        if isOpen(ip, port):
            print(f"{ip} is online. Logging into device to perform post reload check")
            try:
                with ConnectHandler(**device) as net_connect:
                    print(net_connect.send_command("show clock"))
                return True
            except Exception as e:
                print(f"登入 {ip} 失敗: {e}")
                return False
        else:
            print("The device is still reloading. Please wait...")
            time.sleep(delay)

    elapsed_time = time.time() - start_time
    print(f"Total wait time for {ip}: {elapsed_time:.2f} seconds")
    return False


for device in devices_list:
    post_reload_check(device)

isOpen 函式使用 with socket.socket(...) as s: 的方式確保 socket 資源在使用後自動關閉,更符合 Python 的最佳實踐。post_reload_check 函式則會持續檢查連線埠 22 的狀態,直到裝置重新上線或達到最大重試次數。我加入了 retrydelay 引數,讓使用者可以根據實際情況調整檢查頻率和超時時間。使用 with ConnectHandler(**device) as net_connect: 確保 Netmiko 連線在使用後自動關閉,避免資源洩漏。show clock 命令驗證裝置在重啟後的基礎功能是否正常。

為了更清晰地展現程式流程,我使用 圖表來視覺化 post_reload_check 函式的執行邏輯。

  graph TD
    A[開始] --> B{連線埠 22 開啟?};
    B -- Yes --> C[登入裝置];
    C --> D[執行 show clock];
    D --> E[結束];
    B -- No --> F[等待];
    F --> G{達到最大重試次數?};
    G -- Yes --> H[結束];
    G -- No --> B;

圖表説明: 此流程圖描述了 post_reload_check 函式的核心邏輯:持續檢查連線埠 22 是否開啟,若開啟則登入裝置並執行 show clock 命令;若未開啟,則等待一段時間後再次檢查,直到達到最大重試次數。

透過以上步驟,我們成功地構建了一個自動化工具,用於在 Cisco IOS-XE 裝置升級後自動驗證組態。此工具不僅提升了網路管理效率,更減少了人工操作可能帶來的錯誤。更重要的是,它提供了一個可擴充套件的框架,可以根據實際需求加入更多驗證步驟,例如檢查特定組態或執行更複雜的測試。 我認為,在網路自動化領域,Python 結合 Netmiko 的強大功能,能大幅提升網路管理的效率和可靠性。