網路裝置的組態管理往往耗時費力,尤其在面對大量裝置時,自動化成為提升效率的關鍵。本文將介紹如何結合 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)
內容解密:
- 我們首先匯入
jinja2模組中的Template類別。 - 定義了一個Jinja2範本,用於組態介面。
- 使用
render方法渲染範本,傳入介面名稱、IP位址和子網路遮罩。 - 列印渲染後的範本內容。
使用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()
內容解密:
- 我們首先匯入
napalm模組中的get_network_driver函式。 - 使用
get_network_driver函式取得IOS裝置的驅動程式。 - 連線到裝置,傳入IP位址、使用者名稱和密碼。
- 組態裝置,使用
load_merge_candidate方法載入組態檔案,使用commit_config方法提交組態。 - 關閉連線。
使用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)
內容解密:
- 我們首先匯入
nornir模組中的InitNornir類別。 - 初始化Nornir,傳入組態檔案路徑。
- 定義了一個任務函式,用於組態裝置。
- 使用
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']}")
內容解密:
- 使用 xlwings 模組讀取 Excel 檔案中的資料,並將其用於組態網路裝置。
- 在迴圈中,讀取每一列的資料,並使用 netmiko 模組連線到裝置,傳送組態命令。
- 使用 try-except 陳述式處理連線失敗的情況,並列印錯誤訊息。
網路裝置組態自動化的實作與應用
網路裝置的組態管理是網路管理中的重要環節。隨著網路規模的擴大,人工組態網路裝置的方式已經無法滿足需求。因此,自動化組態網路裝置成為了一種趨勢。本文將介紹如何使用Python和Netmiko函式庫實作網路裝置組態的自動化。
使用Excel檔案進行組態範本管理
在實際的網路管理中,通常需要對多台裝置進行相同的組態。為了簡化這一過程,可以使用Excel檔案來管理組態範本。如下表所示,為一個簡單的組態範本範例:
| A | B | C | |
|---|---|---|---|
| 1 | interface GigabitEthernet0/1 | interface GigabitEthernet0/1 | interface GigabitEthernet0/1 |
| 2 | ip address 20.20.20.1 255.255.255.0 | ip address 20.20.20.2 255.255.255.0 | ip address 20.20.20.3 255.255.255.0 |
| 3 | no shutdown | no shutdown | no shutdown |
| … | … | … | … |
內容解密:
- 組態範本的建立:使用Excel檔案來儲存不同的組態範本,每一列代表一個裝置的組態。
- Python指令碼讀取Excel檔案:利用
xlwings函式庫讀取Excel檔案中的組態資訊。 - 使用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檔案,還可以從文字檔案中讀取組態命令。這種方式更加靈活,可以根據需要修改組態檔案。
內容解密:
- 定義組態檔案:建立一個文字檔案(如
command_list.txt),其中包含需要下發到裝置的組態命令。 - 讀取組態檔案:使用Python讀取文字檔案中的組態命令。
- 使用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指令碼來實作這一功能。
內容解密:
- 定義舊組態和新組態:建立一個列表,其中包含舊的組態段和對應的新組態段。
- 讀取舊組態檔案:使用Python讀取舊的組態檔案內容。
- 替換組態內容:使用
replace方法將舊組態內容替換為新組態內容。 - 儲存新組態檔案:將替換後的組態內容儲存到新的組態檔案中。
# 定義舊組態和新組態
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)