返回文章列表

網路自動化檔案傳輸與資料視覺化

本文探討網路自動化的進階應用,包含檔案傳輸與資料視覺化。文章涵蓋使用 Nornir 與 Jinja2 範本自動化組態網路裝置、利用 SCP 協定進行檔案傳輸,以及使用 Matplotlib 繪製效能圖表等實務技巧。透過 Python 與相關網路模組的整合,有效提升網路管理效率,並實作更全面的網路監控與分析。

網路自動化 Python

網路自動化已成為現代網路管理的關鍵技術,能有效簡化繁瑣的組態工作並提升效率。本文將探討如何結合 Nornir、Jinja2 和 Netmiko 等工具,實作網路裝置的自動化組態與檔案傳輸。同時,文章也將示範如何使用 Matplotlib 將收集到的裝置效能資料,例如 CPU 使用率和介面頻寬,轉化為視覺化圖表,以便更直觀地監控網路狀態並進行分析。這些技術的整合應用,能協助網路工程師更有效率地管理和維護網路基礎設施。

網路自動化進階應用:檔案傳輸與資料視覺化

本章節將探討網路自動化的進階應用,涵蓋檔案傳輸與資料視覺化的技術與實作方法。透過結合多種網路連線模組與協定,能夠有效地實作裝置組態的備份、檔案的上傳與下載,以及裝置效能資料的視覺化呈現。

使用Nornir與Jinja範本進行裝置組態

在進行網路自動化時,經常需要對多台裝置進行相同的組態。透過結合Nornir框架與Jinja範本技術,可以實作組態的範本化與自動化分發,大幅提高組態管理的效率。

範例:使用Nornir與Jinja範本組態OSPF

from nornir import InitNornir
from nornir_utils.plugins.functions import print_result
from nornir_netmiko import netmiko_send_config
from jinja2 import Environment, FileSystemLoader
from yaml import safe_load

# 初始化Jinja環境並載入範本
env = Environment(loader=FileSystemLoader("."))
template = env.get_template("commands.txt")

# 載入組態資料
with open("info.yml") as r:
    data = safe_load(r)

# 渲染範本並儲存到組態檔案
with open("conf.txt", "w") as w:
    w.write(template.render(data))

# 初始化Nornir連線
connect = InitNornir()

# 使用Netmiko傳送組態命令
result = connect.run(task=netmiko_send_config, config_file="conf.txt")
print_result(result)

內容解密:

  1. 初始化Jinja環境:使用EnvironmentFileSystemLoader來載入範本檔案commands.txt
  2. 載入組態資料:從info.yml檔案中讀取組態資料,這些資料將用於填充範本。
  3. 渲染範本:使用載入的資料渲染Jinja範本,生成最終的組態命令,並儲存到conf.txt
  4. Nornir連線初始化:初始化Nornir連線物件,用於後續的裝置連線與組態。
  5. 傳送組態命令:使用netmiko_send_config任務傳送組態檔案中的命令到裝置。

檔案傳輸協定的應用

在網路自動化過程中,經常需要進行檔案的傳輸,如備份裝置組態或更新裝置軟體。常見的檔案傳輸協定包括FTP、SFTP、SCP等。

使用SCP協定傳輸檔案

SCP(Secure Copy Protocol)是一種根據SSH的安全檔案傳輸協定。可以使用Netmiko或Nornir結合SCP來實作檔案的傳輸。

範例:使用Nornir進行SCP檔案傳輸

from nornir import InitNornir
from nornir_scrapli.tasks import scp_transfer

# 初始化Nornir連線
nr = InitNornir()

# 定義SCP傳輸任務
def scp_file_transfer(task):
    task.run(
        task=scp_transfer,
        src="local_file.txt",
        dst="remote_file.txt"
    )

# 執行SCP傳輸任務
result = nr.run(task=scp_file_transfer)
print_result(result)

內容解密:

  1. 初始化Nornir連線:建立Nornir連線物件,用於後續的裝置連線。
  2. 定義SCP傳輸任務:使用scp_transfer任務來定義檔案傳輸的操作,包括源檔案和目標檔案的路徑。
  3. 執行SCP傳輸任務:執行定義好的SCP傳輸任務,將檔案從本地傳輸到遠端裝置。

資料視覺化:繪製CPU使用率與介面頻寬圖表

網路自動化不僅僅是組態管理,還包括對裝置效能的監控與分析。透過收集裝置的CPU使用率、介面頻寬等資料,並使用視覺化工具繪製成圖表,可以更直觀地瞭解網路狀態。

範例:繪製CPU使用率圖表

import matplotlib.pyplot as plt

# 假設的CPU使用率資料
cpu_usage = [20, 30, 40, 50, 60]

# 繪製圖表
plt.plot(cpu_usage)
plt.title('CPU 使用率')
plt.xlabel('時間')
plt.ylabel('使用率 (%)')
plt.show()

內容解密:

  1. 準備資料:收集或模擬裝置的CPU使用率資料。
  2. 繪製圖表:使用matplotlib函式庫繪製CPU使用率隨時間變化的折線圖。
  3. 新增標題與標籤:為圖表新增標題、X軸與Y軸的標籤,使圖表更具可讀性。

網路自動化中的檔案傳輸與組態備份

在網路工程領域,檔案傳輸是一項至關重要的任務。我們經常需要在裝置之間上傳或下載各種資料,包括軟體或補丁檔案、組態資料、封包捕捉、記錄檔等。為了實作這些任務,我們可以使用不同的檔案傳輸協定,如FTP、SFTP和SCP。在本章中,我們將探討如何使用Python中的ftplibftprettyparamikonetmikonornir模組來實作不同協定下的檔案傳輸。

檔案傳輸協定

  • FTP(檔案傳輸協定):是一種簡單的檔案傳輸協定,已經在網路上使用了超過40年。雖然它易於使用,但由於缺乏加密,存在安全風險。
  • SFTP(安全檔案傳輸協定):是根據SSH協定的安全檔案傳輸替代方案。它使用單一連線並加密傳輸的資料,因此比FTP更安全。
  • SCP(安全複製協定):透過根據SSH協定的加密通道傳輸檔案。它主要用於傳輸檔案,且由於使用SSH進行身份驗證,也是一種安全的檔案傳輸協定。

使用Netmiko進行組態備份

在開始使用檔案傳輸協定之前,我們先來看看如何使用netmiko模組透過SSH登入裝置並收集組態資料。

範例1.1:使用SSH備份組態檔

from netmiko import Netmiko

# 定義裝置IP列表和裝置型別列表
ip_list = ["10.10.10.1", "10.10.10.2", "10.10.10.3", "10.10.20.1", "10.10.30.1"]
device_list = ["cisco_ios", "cisco_ios", "cisco_ios", "juniper_junos", "huawei"]

# 迭代IP列表和裝置型別列表
for ip, device in zip(ip_list, device_list):
    # 定義連線引數
    ip = {
        "host": f"{ip}",
        "username": "admin",
        "password": "cisco",
        "device_type": f"{device}",
        "global_delay_factor": 0.1
    }

    # 根據裝置型別定義命令
    if ip["device_type"] == "cisco_ios":
        command = "show running-config"
    elif ip["device_type"] == "juniper_junos":
        command = "show configuration | display set"
    elif ip["device_type"] == "huawei":
        command = "display current-configuration"
    else:
        print("This is different vendor (Not Cisco, Huawei or Juniper)")

    try:
        # 嘗試登入裝置並執行命令
        print(f"\n
---
-Try to login: {ip['host']}
---
\n")
        net_connect = Netmiko(**ip)
        output = net_connect.send_command(command)
        
        # 將輸出儲存到檔案
        with open(f"{ip['host']}.txt", "w") as w:
            w.write(output)
    except:
        # 處理登入失敗的情況
        print(f"***Cannot login to {ip['host']}")

內容解密:

  1. 模組匯入與變數定義:首先,我們從netmiko模組中匯入Netmiko類別,並定義了兩個列表:ip_listdevice_list,分別用於儲存裝置的IP地址和對應的裝置型別。
  2. 迭代裝置列表:使用zip函式同時迭代ip_listdevice_list,以便為每個裝置建立連線引數字典。
  3. 命令定義:根據不同的裝置型別,使用if-elif-else陳述式定義了不同的命令,以便從各廠商的裝置中收集組態資料。
  4. 連線與命令執行:在try塊中,嘗試使用定義的引數連線到裝置,並執行收集組態的命令。成功後,將輸出寫入以裝置IP命名的檔案中。
  5. 錯誤處理:在except塊中,處理了連線失敗的情況,列印出無法登入的裝置IP。

這個範例展示瞭如何使用Python和netmiko模組自動化地從不同廠商的網路裝置中備份組態資料。這對於網路管理員來說是一項非常有用的功能,可以大大簡化日常的網路管理工作。

網路裝置檔案傳輸與管理技術解析

在現代網路管理中,遠端存取與檔案傳輸是不可或缺的重要功能。本文將探討如何使用Python的Netmiko和ftplib模組來實作網路裝置的組態擷取與檔案傳輸。

使用Netmiko擷取網路裝置組態

首先,我們來看看如何使用Netmiko模組來連線不同的網路裝置並擷取其目前的組態。以下是一個範例程式碼,展示瞭如何根據不同的裝置型別執行特定的命令:

ip = {
    "host": f"{ip}",
    "username": "admin",
    "password": "cisco",
    "device_type": f"{device}",
    "global_delay_factor": 0.1
}

if ip["device_type"] == "cisco_ios":
    command = "show run"
elif ip["device_type"] == "juniper_junos":
    command = "show configuration | display set"
elif ip["device_type"] == "huawei":
    command = "display current-configuration"
else:
    print("This is different vendor (Not Cisco, Huawei or Juniper)")

try:
    print(f"\n
---
-Try to login: {ip['host']}
---
\n")
    net_connect = Netmiko(**ip)
    output = net_connect.send_command(command)
except:
    print(f"***Cannot login to {ip['host']}")

with open(f"{ip['host']}.txt", "w") as w:
    w.write(output)

內容解密:

  1. 裝置連線引數設定:首先建立一個包含主機IP、使用者名稱、密碼、裝置型別等資訊的字典。
  2. 根據裝置型別選擇命令:使用if-elif-else結構根據不同的裝置型別選擇適當的命令來擷取組態。
  3. 嘗試連線並執行命令:使用Netmiko建立連線並執行指定的命令,擷取輸出結果。
  4. 儲存組態到本地檔案:將擷取到的組態輸出儲存到以裝置IP命名的文字檔案中。

使用ftplib進行FTP檔案傳輸

接下來,我們探討如何使用ftplib模組來實作與網路裝置之間的檔案傳輸。ftplib提供了豐富的功能來上傳、下載和管理遠端檔案。

ftplib主要功能函式

函式名稱功能描述
storbinary()上傳檔案到遠端主機
retrbinary()從遠端主機下載檔案
mkd()在遠端主機建立新目錄
cwd()切換遠端主機的目前目錄
dir()列出遠端主機目前目錄內容
nlst()以清單形式列出遠端主機目前目錄中的檔案名稱
delete()刪除遠端主機上的檔案
rmd()刪除遠端主機上的目錄
quit()關閉FTP連線

範例:使用ftplib上傳和下載檔案

以下是使用ftplib進行檔案上傳和下載的範例程式碼:

import ftplib

# 設定FTP連線引數
host = "10.10.30.1"
username = "admin"
password = "huawei"
filename = "test.txt"

# 建立FTP連線
ftp = ftplib.FTP(host, username, password)

# 上傳檔案
with open(filename, "rb") as upload:
    ftp.storbinary(f"STOR {filename}", upload)

# 下載檔案
with open(filename, "wb") as download:
    ftp.retrbinary(f"RETR {filename}", download.write)

# 關閉FTP連線
ftp.quit()

內容解密:

  1. 建立FTP連線:使用ftplib.FTP類別並提供主機IP、使用者名稱和密碼來建立連線。
  2. 上傳檔案:開啟本地檔案以二進位制讀取模式,並使用storbinary函式將檔案上傳到遠端主機。
  3. 下載檔案:開啟本地檔案以二進位制寫入模式,並使用retrbinary函式從遠端主機下載檔案。
  4. 關閉連線:使用quit函式關閉FTP連線。

比較本地和遠端檔案大小

在進行檔案傳輸後,驗證檔案完整性是非常重要的。以下範例展示瞭如何比較本地和遠端檔案的大小:

import ftplib
import re
import os

# 設定FTP連線引數和檔名
host = "10.10.30.1"
username = "admin"
password = "huawei"
filename = "test.txt"

# 建立FTP連線並列出目錄內容
ftp = ftplib.FTP(host, username, password)
files = []
output = ftp.dir(files.append)
files = " ".join(files)

# 使用正規表示式擷取遠端檔案大小
file_size = re.findall(f"(\d+)\s+\w+\s+\d+\s+\d+:\d+\s+{filename}", files)

# 取得本地檔案大小
local = os.path.getsize(filename)

# 比較檔案大小
if int(local) == int(file_size[0]):
    print(f"'{filename}': '{local}' Bytes. It's same on local and remote host.")
else:
    print("ERROR: File size has a problem.")

內容解密:

  1. 列出遠端目錄內容:使用dir函式列出遠端主機目前目錄的內容,並將結果儲存在清單中。
  2. 擷取遠端檔案大小:使用正規表示式從目錄列表中擷取目標檔案的大小。
  3. 取得本地檔案大小:使用os.path.getsize函式取得本地檔案的大小。
  4. 比較大小:將本地和遠端檔案的大小進行比較,並輸出比較結果。