身為一個網路技術工作者,我經常需要處理大量的網路裝置設定與維護工作。手動操作不僅耗時費力,還容易出錯。因此,我開始探索如何利用自動化工具提升效率,並降低人為錯誤的風險。Python 搭配 Netmiko 程式函式庫便成為我的首選方案。本文將分享我如何使用 Python 和 Netmiko 建立自動化工具,實作 Cisco 路由器設定備份和 IOS 檔案上傳。

自動化備份 Cisco 路由器設定

備份網路裝置設定至關重要,尤其是在系統升級或變更之前。我設計的自動化備份工具的核心概念是利用 Netmiko 建立 SSH 連線到路由器,執行 show 指令,並將輸出儲存到檔案中。Python 的檔案處理能力讓我可以輕鬆地將多個裝置的設定備份到不同的檔案中。

  graph LR
    B[B]
    A[Python 指令碼] --> B{Netmiko};
    B --> C[Cisco 路由器];
    C --> D[Show 指令];
    D --> E[設定輸出];
    E --> F[備份檔案];

Python 備份指令碼

以下是我最佳化後的 Python 備份指令碼:

import time
from netmiko import ConnectHandler

# 裝置資訊
devices = [
    {'device_type': 'cisco_xe', 'host': '192.168.1.1', 'username': 'user', 'password': 'password', 'secret': 'password'},
    {'device_type': 'cisco_xe', 'host': '192.168.1.2', 'username': 'user', 'password': 'password', 'secret': 'password'}
]

# 備份指令列表
show_commands = [
    "show running-config",
    "show ip route",
    "show ip interface brief",
    "show clock",
    "show version",
    "show cdp neighbors",
    "show interfaces",
    "show logging"
]

for device in devices:
    try:
        print(f"正在備份裝置:{device['host']}")
        with ConnectHandler(**device) as conn:
            conn.enable()
            conn.send_config_set("terminal length 0")
            for command in show_commands:
                filename = f"{device['host']}_{command.replace(' ', '_')}.txt"
                output = conn.send_command(command)
                with open(filename, 'w') as f:
                    f.write(output)
                print(f"已儲存 {command} 指令輸出至 {filename}")
                time.sleep(1)  # 適度延遲,避免裝置負載過高
    except Exception as e:
        print(f"備份裝置 {device['host']} 發生錯誤: {e}")

print("所有備份任務已完成")

此指令碼利用 ConnectHandler 建立與 Cisco 裝置的連線。enable() 確保進入特權模式,terminal length 0 避免分頁輸出。迴圈迭代 show_commands 列表,執行每個指令並將輸出儲存至檔案。try...except 區塊捕捉潛在錯誤,例如連線失敗。我還增加了 time.sleep(1),避免裝置負載過高。

額外備份指令建議與 圖表

除了指令碼中包含的指令,我根據經驗,建議加入 show inventoryshow environment 指令,以取得更全面的裝置資訊。

  graph LR
    D[D]
    A[開始] --> B{連線到裝置};
    B -- 成功 --> C[執行 show 指令];
    C --> D{儲存輸出到檔案};
    D -- 成功 --> E[斷開連線];
    E --> F[結束];
    B -- 失敗 --> G[顯示錯誤訊息];
    G --> F;
    D -- 失敗 --> G;

這個流程圖清晰地展現了備份流程的各個步驟,包含錯誤處理機制。

IOS 檔案上傳工具開發

在 IOS 升級過程中,檔案上傳是關鍵步驟。我使用 Netmiko 簡化 SCP 檔案傳輸流程,並加入了必要的錯誤處理和許可權檢查機制。

IOS 檔案準備與環境設定

在進行檔案上傳之前,我做了以下準備工作:

  1. 準備 IOS 檔案:選擇合適的 IOS 映像檔,並計算其 MD5 校驗和,確保檔案完整性。
  2. 設定 Cisco 路由器:設定使用者許可權 (level 15)、AAA 認證和 authorization exec,確保 SCP 檔案傳輸的安全性。

Python 上傳指令碼

以下是我編寫的 Python 上傳指令碼:

from netmiko import ConnectHandler
import getpass

# ... (其他程式碼,例如裝置資訊) ...

def upload_ios(device, ios_file_path):
    try:
        with ConnectHandler(**device) as conn:
            if not conn.check_enable_mode():
                conn.enable()  # 確保進入特權模式
            conn.scp_transfer_file(ios_file_path, "/flash:")
            print(f"IOS 檔案已成功上傳至 {device['host']}")
    except Exception as e:
        print(f"上傳 IOS 檔案至 {device['host']} 失敗: {e}")


# ... (呼叫 upload_ios 函式的程式碼) ...

此指令碼使用 scp_transfer_file 方法進行檔案傳輸。check_enable_mode() 檢查是否已進入特權模式,若否,則執行 enable() 命令。try...except 區塊捕捉並處理潛在的錯誤,例如檔案不存在或網路連線問題。

我根據自身經驗,額外加入了 MD5 校驗和比對功能,確保上傳檔案的完整性。此外,我也會記錄上傳過程中的日誌資訊,方便日後追蹤和除錯。

透過這些自動化工具,我可以更有效率地管理和維護網路裝置,並大幅降低人為錯誤的風險。我相信,網路自動化是未來網路管理的趨勢,而 Python 和 Netmiko 正是實作這一目標的利器。


在現代網路管理中,自動化 IOS 升級是提升效率的關鍵。本文將探討如何使用 Python  Netmiko 構建一個強大的 IOS 升級工具,著重於平行檔案傳輸的實踐,並結合 AAA 設定來提升安全性。

### 平行檔案傳輸的優勢

相較於依序上傳,平行檔案傳輸能顯著縮短升級時間,尤其在需要同時升級多台裝置時,效果更加明顯。Python  `threading` 模組提供了一個簡潔有效的方式來實作平行處理。

### AAA 認證與授權的重要性

在開始任何自動化操作之前,穩固的 AAA 基礎至關重要。正確設定 AAA 認證和授權,能有效防止未經授權的存取和操作,確保網路安全。

以下是在 Cisco 路由器上設定 AAA 的典型組態:

aaa new-model aaa authentication login default local enable aaa authorization exec default local


這些指令啟用 AAA,並設定使用本地帳號進行認證和授權,提供第一層安全防護。

### Python 平行檔案上傳程式碼範例

```python
import threading
import time
from netmiko import ConnectHandler, SCPConn

# 裝置連線資訊
devices = [
    {'device_type': 'cisco_ios', 'host': '192.168.1.1', 'username': 'admin', 'password': 'password123', 'secret': 'password123'},
    {'device_type': 'cisco_ios', 'host': '192.168.1.2', 'username': 'admin', 'password': 'password123', 'secret': 'password123'},
    # ...更多裝置
]

# IOS 檔案資訊
source_file = "/path/to/your/ios_image.bin"
destination_file = "ios_image.bin"

# 檔案傳輸函式
def upload_ios(device):
    try:
        with ConnectHandler(**device) as ssh_conn:
            ssh_conn.enable()
            with SCPConn(ssh_conn) as scp_conn:
                scp_conn.scp_transfer_file(source_file, destination_file)
        print(f"已成功上傳 IOS 至 {device['host']}")
    except Exception as e:
        print(f"上傳至 {device['host']} 失敗: {e}")

# 建立並啟動執行緒
threads = []
for device in devices:
    thread = threading.Thread(target=upload_ios, args=(device,))
    threads.append(thread)
    thread.start()

# 等待所有執行緒完成
for thread in threads:
    thread.join()

print("所有 IOS 檔案上傳完成")

這段程式碼定義了一個 upload_ios 函式,負責單一裝置的 IOS 檔案上傳。主程式利用 threading.Thread 建立多個執行緒,每個執行緒負責一個裝置的上傳任務,實作平行處理。程式碼中也包含了錯誤處理機制,確保程式碼的穩定性。

啟用 SCP 除錯的技巧

在開發和除錯過程中,啟用 SCP 除錯能幫助我們快速定位問題。以下是在 Cisco 路由器上啟用 SCP 除錯的指令:

debug ip scp

這個指令會顯示 SCP 伺服器的詳細除錯資訊,方便我們追蹤檔案傳輸的過程。

平行檔案上傳流程

  graph LR
    B[B]
    A[開始] --> B{建立執行緒};
    B --> C[執行緒 1 上傳 IOS];
    B --> D[執行緒 2 上傳 IOS];
    B --> E[執行緒 3 上傳 IOS];
    C --> F[完成];
    D --> F;
    E --> F;
    F --> G[結束];

圖表説明: 此流程圖展示了平行檔案上傳的過程,每個執行緒同時進行檔案傳輸,大幅提升效率。

  graph LR
    A[連線裝置] --> B[啟用許可權];
    B --> C[建立 SCP 連線];
    C --> D[傳輸檔案];
    D --> E[關閉連線];

圖表説明: 此流程圖詳細展示了單一裝置的 IOS 檔案上傳流程,包含連線裝置、啟用許可權、建立 SCP 連線、傳輸檔案和關閉連線等步驟。

透過 Python 和 Netmiko,結合平行處理和 AAA 設定,我們能構建一個安全、高效的 IOS 升級工具,簡化網路管理流程,並提升整體效率。 我在實務經驗中發現,平行上傳在處理大量裝置時效果尤為顯著,能節省大量的時間和人力成本。 同時,完善的錯誤處理機制也是不可或缺的,能有效避免因意外錯誤導致的升級中斷。

在管理大量網路裝置時,效率至關重要。尤其是在需要同時升級多台裝置的 IOS 版本時,傳統的序列上傳方式耗時費力。為瞭解決這個問題,我開發了一個 Python 指令碼,利用多執行緒技術實作平行上傳,大幅提升效率。

平行上傳的優勢

相較於逐一上傳 IOS 檔案到每台路由器,平行上傳可以同時進行多個上傳任務,充分利用網路頻寬和裝置資源,從而縮短整體的升級時間。尤其在大型網路環境中,這個優勢更加顯著。

Python threading 模組實作

以下是我使用 Python threading 模組撰寫的平行上傳指令碼 upload_ios2_parallel.py

import time
from netmiko import ConnectHandler, SCPConn
import threading

source_newios = "/home/jdoe/ch10_tools_dev2/new_ios/c8000v-Dev-File-Only.bin"
destination_newios = "c8000v-Dev-File-Only.bin"

device1 = {
    'device_type': 'cisco_xe',
    'host': '192.168.127.111',
    'username': 'jdoe',
    'password': 'cisco123',
    'secret': 'cisco123'
}

device2 = {
    'device_type': 'cisco_xe',
    'host': '192.168.127.222',
    'username': 'jdoe',
    'password': 'cisco123',
    'secret': 'cisco123'
}

devices_list = [device1, device2]

def upload_file(device):
    ip = str(device['host'])
    username = str(device['username'])
    try:
        net_connect = ConnectHandler(**device)
        print(f"已成功連線至 {ip}!")
        net_connect.enable()
        print(f"已進入啟用模式,準備上傳 IOS 至 {ip}...")
        scp_conn = SCPConn(net_connect)
        scp_conn.scp_transfer_file(source_newios, destination_newios)
        print(f"新 IOS 檔案已成功上傳至 {ip}!")
        net_connect.disconnect()
    except Exception as e:
        print(f"在 {ip} 上發生錯誤:{e}")


# 建立執行緒並開始平行上傳
threads = []
for device in devices_list:
    thread = threading.Thread(target=upload_file, args=(device,))
    thread.start()
    threads.append(thread)

# 等待所有執行緒完成
for thread in threads:
    thread.join()

print("所有檔案上傳已完成。")

此指令碼的核心概念是利用 threading.Thread 建立多個執行緒,每個執行緒負責將 IOS 檔案上傳到一台路由器。target=upload_file 指定執行緒執行的函式,args=(device,) 將裝置資訊傳遞給函式。thread.start() 啟動執行緒,thread.join() 等待執行緒完成。透過這個機制,我們可以同時上傳檔案到多台裝置,有效縮短時間。我還加入了錯誤處理機制,確保即使其中一台裝置出現問題,也不會影響其他裝置的上傳進度。

與 Ansible 的比較

Ansible 雖然也根據 Python,但它並未使用 Python 的 threading 模組,而是採用自身的任務系統和模組,例如 asyncasync_task,來實作平行執行。雖然 Ansible 提供了更完善的網路自動化框架,但在某些特定場景下,直接使用 Python threading 可以更精細地控制執行緒的行為,並根據需求進行客製化。

執行指令碼

執行 upload_ios2_parallel.py 後,指令碼將會平行上傳 IOS 檔案到指定的路由器。

jdoe@u22s1:~/ch10_tools_dev2/tool7_upload_ios$ python upload_ios2_parallel.py

平行與序列上傳比較

  graph LR
A[序列上傳] --> B(裝置 1);
B --> C(裝置 2);

D[平行上傳] --> E(裝置 1);
D --> F(裝置 2);

style E fill:#ccf,stroke:#888,stroke-width:2px
style F fill:#ccf,stroke:#888,stroke-width:2px

圖表説明: 此圖表清楚地比較了序列上傳和平行上傳的差異。序列上傳需要等待前一個裝置完成後才能開始下一個,而平行上傳可以同時進行,顯著提高效率。

平行上傳 IOS 檔案可以大幅提升網路裝置管理的效率。這個方法不僅適用於 IOS 升級,也可以應用於其他需要批次操作網路裝置的場景,例如組態備份、版本檢查等。透過自動化指令碼,我們可以將繁瑣的重複性工作交給程式處理,釋放人力資源,專注於更重要的任務。 我個人認為,掌握多執行緒技術對於網路工程師來説至關重要,它能幫助我們更好地應對日益複雜的網路環境。