在網路管理的領域中,Cisco IOS 裝置的升級作業至關重要,它不僅能修復漏洞、提升效能,還能引入新功能。然而,傳統的手動升級方式費時費力與容易出錯。本文將分享我使用 Python 和 Netmiko 開發的自動化升級流程,並融入個人經驗和最佳實務,希望能幫助大家提升網路升級的效率和可靠性。

自動化升級流程解析

我的自動化升級流程主要包含以下四個步驟:

  1. 版本比對: 在升級前,我會使用 show version 命令取得裝置目前的 IOS 版本資訊,並利用 Python 的 difflib 函式庫與新版本進行比對。為了更直觀地呈現差異,我將比對結果輸出為 HTML 格式的報告。
import difflib

def compare_versions(pre_version, post_version, ip):
    diff = difflib.HtmlDiff().make_file(pre_version.splitlines(), post_version.splitlines(), "舊版本", "新版本")
    with open(f"{ip}_version_diff.html", "w") as f:
        f.write(diff)

這段程式碼的核心在於使用 difflib.HtmlDiff() 產生 HTML 格式的版本差異報告讓使用者可以清楚地看到新舊版本之間的變更
  1. 變更啟動設定: 使用 Netmiko 的 send_config_set 方法,將新的 IOS 映像檔設定為啟動組態。為了確保設定的正確性,我會在指令中包含 do write memory 指令。
from netmiko import ConnectHandler

def change_boot_config(device, new_ios):
    try:
        with ConnectHandler(**device) as conn:
            conn.enable()
            conn.send_config_set([f"no boot system", f"boot system flash:/{new_ios}", "do write memory"])
    except Exception as e:
        print(f"設定啟動組態錯誤:{e}")

這段程式碼使用 Netmiko 連線到裝置並傳送設定指令來變更啟動設定確保裝置在下次啟動時使用新的 IOS 映像檔try...except 區塊用於捕捉潛在的錯誤
  1. 重啟裝置並驗證: 使用 reload 命令重啟裝置,並在重啟完成後再次使用 show version 命令驗證新版本是否已成功啟動。
def reload_and_verify(device, expected_version):
    try:
        with ConnectHandler(**device) as conn:
            conn.enable()
            conn.send_command_timing("reload")
            # 等待裝置重啟完成 (此處需要根據實際情況調整等待時間和判斷方式)
            post_reload_version = conn.send_command("show version")
            if expected_version in post_reload_version:
                print("IOS 升級成功")
            else:
                print("IOS 升級失敗")
    except Exception as e:
        print(f"重啟驗證錯誤:{e}")

這段程式碼負責重啟裝置並驗證升級結果send_command_timing 函式用於處理 reload 命令執行過程中可能出現的延遲
  1. 多執行緒處理: 為了提升效率,我使用多執行緒同時升級多台裝置。
import threading

def upgrade_devices(devices, new_ios, expected_version):
    threads = []
    for device in devices:
        thread = threading.Thread(target=upgrade_device, args=(device, new_ios, expected_version))
        threads.append(thread)
        thread.start()

    for thread in threads:
        thread.join()

利用多執行緒技術可以同時升級多台裝置大幅縮短升級所需的時間提升整體效率

升級流程

  graph LR
    B[B]
    D[D]
A[版本比對] --> B{變更啟動設定};
B --> C[重啟裝置];
C --> D{驗證版本};

最佳實務與經驗分享

  • 模組化設計: 將程式碼拆分為多個函式,提升程式碼的可讀性和可維護性。
  • 錯誤處理: 加入 try…except 區塊,捕捉並處理程式執行過程中可能發生的錯誤,提高程式碼的穩定性。
  • 日誌記錄: 記錄升級過程中的關鍵資訊,方便日後追蹤和除錯。
  • 版本控制: 使用 Git 等版本控制系統管理程式碼,方便追蹤版本變更和回復。

我計劃在未來加入更多功能,例如自動備份組態、整合自動化測試等,使整個升級流程更加完善和可靠。

  gantt
    dateFormat  YYYY-MM-DD
    title       IOS 升級專案時程
    excludes    weekends
    section 準備階段
    版本比對       :a1, 2025-04-01, 1d
    備份組態             :after a1, 1d
    section 升級階段
    變更啟動設定             :b1, after a1, 1d
    重啟裝置             :after b1, 1d
    驗證版本             :after b2, 1d

在現今錯綜複雜的網路環境中,有效管理 IP 位址和資料中心基礎設施至關重要。NetBox,一個根據 Python Django 框架的開源 IP 位址管理(IPAM)和資料中心基礎設施管理(DCIM)工具,提供了一個全面的解決方案。它不僅能協助管理 IP 位址,簡化組態流程,更能作為網路自動化的單一資料來源,大幅提升網路管理效率。本文將探討 NetBox 的核心概念和功能,並逐步引導您在 Ubuntu 22.04 LTS 上進行安裝和設定。

NetBox 核心概念:以 “Site” 為中心

NetBox 的核心概念是 “Site”,它通常代表一個實際的地理位置,例如建築物或校園。每個 Site 都需要一個唯一的名稱,並且可以關聯到一個區域或租戶。Site 作為 NetBox 的核心,與地理位置、租戶、機架以及裝置、網路介面、VLAN 等組態資訊 (CI) 相關聯。

  graph LR
    Device[Device]
    IP_Address[IP_Address]
    Interface[Interface]
    Location[Location]
    Rack[Rack]
    Region[Region]
    Site[Site]
    Tenant[Tenant]
    VLAN[VLAN]
    Site --> Region
    Site --> Location
    Site --> Tenant
    Site --> Rack
    Site --> Device
    Site --> Interface
    Site --> VLAN
    Site --> IP_Address

上述 圖表清楚地展現了 Site 與其他 NetBox 元素之間的關係。Site 位於中心,連結到 Region、Location、Tenant、Rack、Device、Interface、VLAN 和 IP_Address 等相關元素,形成一個以 Site 為中心的網路拓撲結構。我認為這樣的設計,能有效地組織和管理不同層級的網路資源。

NetBox IPAM:高階概覽

NetBox 的主要功能是 IPAM,它應該作為網路中所有 IP 位址的單一真相來源。一個 IP 位址通常與一個介面(實體/虛擬)、父字首和子字首相關聯。該介面隸屬於一個 IP 裝置,而父字首則與聚合網路相關聯。

  graph LR
    Aggregated_Network[Aggregated_Network]
    Child_Prefix[Child_Prefix]
    Device[Device]
    IP_Address[IP_Address]
    Interface[Interface]
    Parent_Prefix[Parent_Prefix]
    IP_Address --> Interface
    IP_Address --> Parent_Prefix
    IP_Address --> Child_Prefix
    Interface --> Device
    Parent_Prefix --> Aggregated_Network

這個 圖表説明瞭 NetBox 中 IP 位址的屬性及其關係。IP_Address 連結到 Interface、Parent_Prefix 和 Child_Prefix,而 Interface 連結到 Device,Parent_Prefix 連結到 Aggregated_Network。這樣的設計,讓管理者可以清楚地瞭解每個 IP 位址的歸屬和階層關係,避免 IP 位址衝突,並有效地規劃 IP 位址的使用。

將 NetBox 轉變為多租戶 IPAM

對於管理多個客戶網路的 MSP (Managed Service Provider) 而言,NetBox 的多租戶功能至關重要。您可以使用 Region 來代表客戶,使用 sub-region 來代表國家或州,然後將這些 Region 與 Site 關聯起來。這種模型非常適用於 MSP 環境,因為多個組織的資訊將儲存在同一個資料函式庫中,卻又能有效區隔。

  graph LR
    MSP[MSP]
    Site[Site]
    MSP --> Region(Customer)
    Region --> SubRegion(Country/State)
    SubRegion --> Site

這個 圖表展示瞭如何在 NetBox 中使用 Region 建模 MSP 環境。MSP 管理多個 Region (Customer),每個 Region 又包含多個 SubRegion (Country/State),最後 SubRegion 與 Site 關聯。我認為,這種階層式的設計,能有效地隔離不同客戶的網路資源,同時方便 MSP 進行集中管理。

在 Ubuntu 22.04 LTS 上安裝 NetBox 3

以下步驟概述了在 Ubuntu 22.04.1 LTS 伺服器上安裝 NetBox 的完整過程:

  1. 驗證 Python 版本並更新套件函式庫: 您的 Python 版本必須至少為 3.8。

    python3 -V  # 確認 Python3 版本
    sudo apt update  # 更新套件函式庫
    

    首先,我們使用 python3 -V 確認系統上的 Python3 版本是否符合 NetBox 的需求。接著,使用 sudo apt update 更新系統的套件函式庫,確保我們安裝的套件都是最新版本。

  2. 安裝 PostgreSQL、Redis 和必要的 Python 套件:

    sudo apt install -y postgresql redis-server python3 python3-pip python3-venv python3-dev build-essential libxml2-dev libxslt1-dev libffi-dev libpq-dev libssl-dev zlib1g-dev
    

    這段程式碼一次性安裝了所有 NetBox 需要的套件,包含 PostgreSQL 資料函式庫、Redis 快取伺服器,以及 Python 相關的套件和函式庫。這樣的做法可以簡化安裝流程,避免個別安裝時可能遇到的相依性問題。

  3. 啟動 PostgreSQL 和 Redis 服務:

    sudo systemctl start postgresql
    sudo systemctl enable postgresql  # 設定 PostgreSQL 開機自動啟動
    sudo systemctl start redis-server
    sudo systemctl enable redis-server  # 設定 Redis 開機自動啟動
    

    安裝完 PostgreSQL 和 Redis 後,我們需要啟動它們的服務,並設定開機自動啟動,確保 NetBox 可以正常使用這些服務。

後續的安裝步驟,包含建立 NetBox 使用者、設定資料函式庫、下載 NetBox 原始碼等,將在下一篇文章中詳細説明。敬請期待!

深入 NetBox 架構

在正式開始佈署之前,先讓我們瞭解 NetBox 的系統架構。它採用模組化設計,各個元件協同工作,提供完整的網路管理功能。

  graph LR
    subgraph Client
        A[瀏覽器] --> B(Web 伺服器)
    end
    B --> C[NetBox 應用程式]
    C --> D(PostgreSQL 資料函式庫)
    C --> E(Redis 快取)

圖表説明: 客戶端透過瀏覽器與 Web 伺服器互動,Web 伺服器將請求轉發至 NetBox 應用程式。NetBox 應用程式則與 PostgreSQL 資料函式庫和 Redis 快取進行資料交換,確保高效能的資料存取。

NetBox 佈署實戰

接下來,我將逐步引導你完成 NetBox 的安裝與設定。

安裝必要套件與升級

首先,根據實際需求,我們可以安裝額外的 Python 套件。舉例來説,napalm 套件能增強 NetBox 的網路自動化能力:

sudo sh -c "echo 'napalm' >> /opt/netbox/local_requirements.txt"

這段程式碼將 napalm 這個強大的網路自動化工具加入到 local_requirements.txt 檔案中。它能與 NetBox 無縫整合,實作網路裝置的自動化組態和管理,大幅提升效率。我個人非常推薦使用 napalm 來簡化繁瑣的網路操作。

接著,執行升級指令以安裝所有必要的套件和設定 NetBox:

sudo /opt/netbox/upgrade.sh

這個指令碼會自動安裝所有在 local_requirements.txt 中指定的套件,同時更新 NetBox 程式碼、建立資料函式庫,並執行必要的資料函式庫遷移。它就像一個自動化的管家,幫我們處理所有繁瑣的設定工作。

建立超級使用者與測試 NetBox

建立超級使用者帳號,以便登入和管理 NetBox:

source /opt/netbox/venv/bin/activate
cd /opt/netbox/netbox
python3 manage.py createsuperuser

首先,我們啟動 NetBox 的虛擬環境,確保所有相依套件正確載入。接著,使用 Django 內建的 createsuperuser 指令建立一個擁有最高許可權的超級使用者帳號。

設定排程任務,讓 NetBox 自動執行日常維護工作:

sudo ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping

透過建立符號連結,我們將 NetBox 的日常維護指令碼 netbox-housekeeping.sh 加入到系統的每日排程任務中。這能自動清理過期資料、更新快取等,確保 NetBox 保持最佳效能。

在開發環境中測試 NetBox:

python3 manage.py runserver 0.0.0.0:8000 --insecure

這段程式碼啟動 NetBox 的開發伺服器,方便我們在瀏覽器中直接測試 NetBox 的功能。--insecure 引數允許我們跳過一些安全檢查,加速開發流程。

NetBox 佈署流程圖

以下流程圖總結了 NetBox 的安裝步驟:

  graph LR
    B[B]
    D[D]
    H[H]
    A[安裝 Redis 和 Python] --> B{建立 NetBox 目錄}
    B --> C[下載 NetBox 程式碼]
    C --> D{建立 NetBox 使用者}
    D --> E[設定 NetBox]
    E --> F[安裝額外套件]
    F --> G(升級 NetBox)
    G --> H{建立超級使用者}
    H --> I[測試 NetBox]

圖表説明: 這個流程圖清晰地展示了 NetBox 的安裝步驟,從準備環境到最終測試,涵蓋了所有關鍵環節。

NetBox 進階應用

完成 NetBox 的基本佈署後,你可以根據自身需求進行更進一步的設定和客製化,例如新增裝置、IP 位址、線路連線等資訊。NetBox 提供了豐富的功能和 API,讓你能更有效地管理網路基礎設施。

我建議深入探索 NetBox 的檔案和社群資源,持續學習並發掘更多進階應用技巧。透過靈活運用 NetBox,你將能開發一個真正符合自身需求的強大網路管理平台。