網路裝置的組態管理往往耗時費力,尤其在面對大量裝置時,自動化成為提升效率的關鍵。本文將介紹如何結合 Python 與 Netmiko、NAPALM、Nornir 等工具,實作網路裝置的自動化組態和管理。我們將使用 Jinja2 範本生成組態檔案,並利用 YAML 檔案管理裝置資訊。此外,文章也涵蓋了使用 Netmiko 模組進行介面組態、建立裝置資訊迴圈、從文字檔或 Excel 表格讀取裝置資訊及組態指令,以及使用 NAPALM 和 Nornir 進行更進階的自動化組態和管理。透過這些技術的整合,可以大幅簡化網路裝置的組態流程,提升管理效率。

網路裝置組態佈署

本章節將著重於使用不同的模組和功能來組態網路裝置。我們將使用Jinja2範本、YAML檔案、NAPALM模組和Nornir自動化框架。作為進階用法,我們將使用這些模組和範本以更自動化的方式組態多個裝置。

網路裝置組態

在前一章中,我們學習瞭如何使用不同的模組連線網路裝置並收集日誌。在本章中,我們將進一步探討如何組態網路裝置。

介面組態

介面組態是網路裝置組態的重要部分。我們將使用Jinja2範本和YAML檔案來組態介面。

使用Jinja2範本組態介面

Jinja2範本是一種強大的範本引擎,可以用來生成組態檔案。我們將使用Jinja2範本來組態介面。

from jinja2 import Template

# 定義Jinja2範本
template = Template('''
interface {{ interface_name }}
  ip address {{ ip_address }} {{ subnet_mask }}
''')

# 渲染範本
interface_name = 'GigabitEthernet0/0'
ip_address = '192.168.1.1'
subnet_mask = '255.255.255.0'
rendered_template = template.render(interface_name=interface_name, ip_address=ip_address, subnet_mask=subnet_mask)

print(rendered_template)

內容解密:

  1. 我們首先匯入jinja2模組中的Template類別。
  2. 定義了一個Jinja2範本,用於組態介面。
  3. 使用render方法渲染範本,傳入介面名稱、IP位址和子網路遮罩。
  4. 列印渲染後的範本內容。

使用NAPALM模組組態裝置

NAPALM模組是一種用於組態和管理網路裝置的Python函式庫。我們將使用NAPALM模組來組態裝置。

from napalm import get_network_driver

# 連線到裝置
driver = get_network_driver('ios')
device = driver('192.168.1.1', 'username', 'password')
device.open()

# 組態裝置
config = '''
interface GigabitEthernet0/0
  ip address 192.168.1.1 255.255.255.0
'''
device.load_merge_candidate(config=config)
device.commit_config()

# 關閉連線
device.close()

內容解密:

  1. 我們首先匯入napalm模組中的get_network_driver函式。
  2. 使用get_network_driver函式取得IOS裝置的驅動程式。
  3. 連線到裝置,傳入IP位址、使用者名稱和密碼。
  4. 組態裝置,使用load_merge_candidate方法載入組態檔案,使用commit_config方法提交組態。
  5. 關閉連線。

使用Nornir模組組態裝置

Nornir模組是一種用於自動化網路裝置管理的Python函式庫。我們將使用Nornir模組來組態裝置。

from nornir import InitNornir

# 初始化Nornir
nr = InitNornir(config_file='config.yaml')

# 組態裝置
def configure_devices(task):
    # 組態裝置的任務
    config = '''
    interface GigabitEthernet0/0
      ip address 192.168.1.1 255.255.255.0
    '''
    task.run(task=napalm_configure, config=config)

nr.run(task=configure_devices)

內容解密:

  1. 我們首先匯入nornir模組中的InitNornir類別。
  2. 初始化Nornir,傳入組態檔案路徑。
  3. 定義了一個任務函式,用於組態裝置。
  4. 使用nr.run方法執行任務。

網路裝置自動化組態與管理

使用 Nornir-Netmiko 和 Nornir-NAPALM 連線裝置

透過前幾章的知識,我們可以輕鬆地使用 netmiko 和 paramiko 模組登入裝置並進行組態。在基本使用中,我們可以處理簡單的任務。當需要處理更複雜的任務時,我們必須使用一些模組或框架來增加自動化。我們使用 Jinja 等組態範本來減少程式碼行數,組態多台裝置。使用 NAPALM 模組以更直接的方式連線裝置。我們建立了一個 nornir 自動化平台,以便使用更快的連線型別開發自動化指令碼。

組態網路裝置

正如前一章所做的那樣,我們可以為從任何網路或系統裝置收集資料建立自動化指令碼。我們還可以使用 Python 指令碼修改、實施和組態這些裝置。我們可以使用一個簡單的指令碼佈署 10 或甚至 100 台裝置。我們使用 netmiko 模組,其效能優於 paramiko 模組,用於在網路裝置中佈署組態。與前一章一樣,總是有一個選項可以使用多執行緒來平行組態裝置。

建立裝置資訊迴圈

在範例 5.1 中,我們嘗試再次使用 netmiko 模組登入裝置。對於 netmiko,我們有一個新增裝置的格式,我們需要新增一個唯一的 IP 位址。但是,帳號、密碼、延遲或裝置型號可以相同或不同。我們輸入了太多引數和很多行範例。我們可以為這些引數建立一個 for 迴圈,以避免太多重複的程式碼。

from netmiko import Netmiko

ip_list = ["10.10.10.1", "10.10.10.2", "10.10.10.3", "10.10.10.4"]

for ip in ip_list:
    device = {
        "host": f"{ip}",
        "username": "admin",
        "password": "cisco",
        "device_type": "cisco_ios",
        "global_delay_factor": 0.1
    }
    try:
        print(f"\n
---
Try to Login: {device['host']} 
---
\n")
        net_connect = Netmiko(**device)
        output = net_connect.send_command("show interface description")
        print(output)
    except:
        print(f"***Cannot login to {device['host']}")

從文字檔取得裝置資訊

在範例 5.2 中,我們匯入 re 模組。我們開啟 host_info 文字檔並讀取它。之後,我們建立 ip_list 變數並將每一行作為一個唯一的專案取得到這個變數中。

from netmiko import Netmiko
import re

with open("host_info.txt") as r:
    host = r.read()
ip_list = re.split("\n", host)

for ip in ip_list:
    device = {
        "host": f"{ip}",
        "username": "admin",
        "password": "cisco",
        "device_type": "cisco_ios",
        "global_delay_factor": 0.1
    }
    try:
        print(f"\n
---
Try to Login: {device['host']} 
---
\n")
        net_connect = Netmiko(**device)
        output = net_connect.send_command("show interface description")
        print(output)
    except:
        print(f"***Cannot login to {device['host']}")

組態介面

在範例 5.3 中,我們建立了一個 netmiko 指令碼,以執行命令來組態 Cisco 路由器的主機名、OSPF 和介面組態。我們使用 xlwings 模組從 Excel 檔案中收集所有三台裝置的資料。這是一個第三方 Python 模組,必須使用 pip install xlwings 命令在終端機中安裝。該模組開啟一個 Excel 檔案,然後讀取所有列中的資料,使用 range 函式寫入 A1:A14 範圍。

程式碼解析

# 使用 xlwings 模組讀取 Excel 檔案中的資料
import xlwings as xw

# 開啟 Excel 檔案
wb = xw.Book('device_config.xlsx')

# 取得工作表
sheet = wb.sheets['Sheet1']

# 讀取資料
for i in range(1, 4):
    config = sheet.range(f'A1:A14').value
    device = {
        "host": sheet.range(f'A{i+1}').value,
        "username": "admin",
        "password": "cisco",
        "device_type": "cisco_ios",
        "global_delay_factor": 0.1
    }
    try:
        print(f"\n
---
Try to Login: {device['host']} 
---
\n")
        net_connect = Netmiko(**device)
        output = net_connect.send_config_set(config)
        print(output)
    except:
        print(f"***Cannot login to {device['host']}")

內容解密:

  1. 使用 xlwings 模組讀取 Excel 檔案中的資料,並將其用於組態網路裝置。
  2. 在迴圈中,讀取每一列的資料,並使用 netmiko 模組連線到裝置,傳送組態命令。
  3. 使用 try-except 陳述式處理連線失敗的情況,並列印錯誤訊息。

網路裝置組態自動化的實作與應用

網路裝置的組態管理是網路管理中的重要環節。隨著網路規模的擴大,人工組態網路裝置的方式已經無法滿足需求。因此,自動化組態網路裝置成為了一種趨勢。本文將介紹如何使用Python和Netmiko函式庫實作網路裝置組態的自動化。

使用Excel檔案進行組態範本管理

在實際的網路管理中,通常需要對多台裝置進行相同的組態。為了簡化這一過程,可以使用Excel檔案來管理組態範本。如下表所示,為一個簡單的組態範本範例:

ABC
1interface GigabitEthernet0/1interface GigabitEthernet0/1interface GigabitEthernet0/1
2ip address 20.20.20.1 255.255.255.0ip address 20.20.20.2 255.255.255.0ip address 20.20.20.3 255.255.255.0
3no shutdownno shutdownno shutdown

內容解密:

  1. 組態範本的建立:使用Excel檔案來儲存不同的組態範本,每一列代表一個裝置的組態。
  2. Python指令碼讀取Excel檔案:利用xlwings函式庫讀取Excel檔案中的組態資訊。
  3. 使用Netmiko進行裝置組態:透過Netmiko函式庫連線到網路裝置,並將讀取到的組態資訊下發到裝置上。
import xlwings
from netmiko import Netmiko

# 開啟Excel檔案
excel = xlwings.Book("Config_file.xlsx").sheets['Sheet1']

# 定義裝置IP地址和對應的Excel列
column = ["A","B","C"]
host = ["10.10.10.1", "10.10.10.2", "10.10.10.3"]

for x, ip in zip(column, host):
    print(f"
---
Connected to {ip}
---
")
    # 從Excel中讀取組態資訊
    configuration = excel.range(f"{x}1:{x}14").value
    
    # 定義裝置連線資訊
    device = {"host": ip, "username": "admin", "password": "cisco", "device_type": "cisco_ios"}
    
    # 連線裝置並下發組態
    net_connect = Netmiko(**device)
    net_connect.send_config_set(configuration)

從文字檔案中讀取組態命令

除了使用Excel檔案,還可以從文字檔案中讀取組態命令。這種方式更加靈活,可以根據需要修改組態檔案。

內容解密:

  1. 定義組態檔案:建立一個文字檔案(如command_list.txt),其中包含需要下發到裝置的組態命令。
  2. 讀取組態檔案:使用Python讀取文字檔案中的組態命令。
  3. 使用Netmiko下發組態:連線到網路裝置,並使用send_config_from_file方法下發組態檔案中的命令。
from netmiko import Netmiko

# 讀取裝置IP地址列表
with open("host_info.txt") as r:
    host = r.read()
ip_list = host.split("\n")

for ip in ip_list:
    # 定義裝置連線資訊
    device = {"host": ip, "username": "admin", "password": "cisco", "device_type": "cisco_ios"}
    
    try:
        print(f"\n
---
Try to Login: {ip} 
---
\n")
        net_connect = Netmiko(**device)
        # 從檔案中讀取組態命令並下發
        output = net_connect.send_config_from_file("command_list.txt")
        print(output)
    except:
        print(f"***Cannot login to {ip}")

組態檔案的替換與更新

在實際應用中,可能需要對現有的組態檔案進行修改或替換。可以使用Python指令碼來實作這一功能。

內容解密:

  1. 定義舊組態和新組態:建立一個列表,其中包含舊的組態段和對應的新組態段。
  2. 讀取舊組態檔案:使用Python讀取舊的組態檔案內容。
  3. 替換組態內容:使用replace方法將舊組態內容替換為新組態內容。
  4. 儲存新組態檔案:將替換後的組態內容儲存到新的組態檔案中。
# 定義舊組態和新組態
command_change = [
    """interface GigabitEthernet0/0
description TEST""",
    "interface GigabitEthernet0/0",
    """interface GigabitEthernet0/1
no ip address
shutdown""",
    """interface GigabitEthernet0/1
ip address 192.168.10.10 255.255.255.0"""
]

# 讀取舊組態檔案
with open("old_config.txt") as old_config:
    new_config = old_config.read()

# 替換組態內容
item_count = len(command_change)
for x in range(0, item_count, 2):
    new_config = new_config.replace(command_change[x], command_change[x + 1])

# 儲存新組態檔案
with open("new_config.txt", "w") as new:
    new.write(new_config)