網路自動化已成為現代網路管理的關鍵技術,有效提升效率並降低人為錯誤。本文介紹如何利用 Jinja2 範本引擎結合 YAML 資料,實作路由器介面組態的自動化,並探討如何使用 NAPALM 與 Nornir 框架收集網路裝置資訊和執行組態管理。透過 Jinja2 範本,我們可以根據 YAML 資料動態生成路由器組態,並使用條件陳述式實作更彈性的組態邏輯。此外,NAPALM 提供統一的 API 介面,簡化了跨廠商裝置的資訊收集流程,而 Nornir 框架則提供了更進階的自動化能力,支援多執行緒和外掛程式,可與 Netmiko 和 NAPALM 等函式庫整合,實作更複雜的自動化任務,例如批次執行命令、收集裝置資訊、以及進行組態變更。
網路裝置組態自動化:使用 Jinja 範本與 YAML 資料實作路由器介面組態
在現代網路管理中,自動化組態網路裝置已成為提高效率和減少錯誤的重要手段。本文將探討如何使用 Jinja 範本引擎與 YAML 資料格式來實作路由器介面組態的自動化。
使用 Jinja 範本生成路由器組態
Jinja 是一種強大的範本引擎,廣泛應用於自動化組態生成。透過結合 Jinja 範本與 YAML 資料,可以動態生成符合特定需求的路由器組態。
組態範本範例
{% for int in interfaces %}
interface {{ int["int_name"] }}
description {{ int["description"] }}
ip address {{ int["ip_address"] }} {{ int["subnet_mask"] }}
no shutdown
{% endfor %}
YAML 資料範例
- hostname: Router-1
interfaces:
- int_name: GigabitEthernet0/1
description: Service_Interface_1
ip_address: 172.16.10.10
subnet_mask: 255.255.255.0
- int_name: GigabitEthernet0/2
description: MGMT_Interface_1
ip_address: 10.0.0.10
subnet_mask: 255.255.255.0
內容解密:
{% for int in interfaces %}:此行開始一個迴圈,遍歷interfaces列表中的每個介面。interface {{ int["int_name"] }}:輸出介面的名稱,例如GigabitEthernet0/1。description {{ int["description"] }}:設定介面的描述,例如Service_Interface_1。ip address {{ int["ip_address"] }} {{ int["subnet_mask"] }}:設定介面的 IP 地址和子網路遮罩。no shutdown:啟用介面,使其處於活動狀態。
使用 if 陳述式進行條件組態
在某些情況下,需要根據特定條件來決定是否啟用或關閉介面,或是套用特定的存取控制列表(ACL)。Jinja 的 if 陳述式提供了這種靈活性。
範例範本
{% for int in interfaces %}
interface {{ int["name"] }}
description {{ int["description"] }}
ip address {{ int["ip_address"] }} {{ int["subnet_mask"] }}
{% if int['active'] %}no {% endif %}shutdown
{% if int['active'] %}ip access-group {{ acl_no }} in {% endif %}
{% endfor %}
對應的 YAML 資料
acl_no: 1
interfaces:
- name: GigabitEthernet0/1
description: Service_Interface
ip_address: 172.16.10.10
subnet_mask: 255.255.255.0
active: true
- name: GigabitEthernet0/2
description: NOT_USED
active: false
內容解密:
{% if int['active'] %}no {% endif %}shutdown:如果介面的active狀態為真,則輸出no shutdown,否則輸出shutdown。{% if int['active'] %}ip access-group {{ acl_no }} in {% endif %}:如果介面為活動狀態,則套用指定的 ACL。
結果驗證
執行上述組態後,可以透過路由器的命令列介面(CLI)來驗證組態結果。例如,使用 show interfaces description 和 show ip interface brief 命令來檢查介面的狀態和組態。
網路自動化與可程式化:使用NAPALM收集裝置日誌
在網路自動化的領域中,如何有效地收集和分析網路裝置的日誌是一個重要的課題。NAPALM(Network Automation and Programmability Abstraction Layer with Multivendor)是一個強大的Python函式庫,它提供了一個統一的API來連線和管理不同廠商的網路裝置。本文將介紹如何使用NAPALM模組來收集網路裝置的日誌。
使用NAPALM的優點
NAPALM建立在netmiko模組之上,目前支援Cisco、Juniper和Arista等裝置。雖然它的廠商支援範圍不如netmiko廣泛,但它在處理不同廠商的裝置時,使用相同的語法,使得操作更加簡單。此外,NAPALM提供了豐富的getter函式,可以方便地收集裝置的日誌,並將其轉換為JSON格式。
收集介面資訊
要使用NAPALM收集介面資訊,首先需要安裝NAPALM模組。可以在終端機中執行pip install napalm命令來完成安裝。
程式碼範例
import napalm
import json
# 定義主機資訊
host = {"hostname": "10.10.10.1", "username": "admin", "password": "cisco"}
# 取得網路驅動程式
driver = napalm.get_network_driver("ios")
# 連線裝置
connect = driver(**host)
connect.open()
# 取得介面資訊
output = connect.get_interfaces()
# 列印輸出結果
print(json.dumps(output, indent=1))
# 關閉連線
connect.close()
內容解密:
- 匯入必要的模組:首先匯入
napalm和json模組。napalm用於連線網路裝置,而json用於處理JSON資料。 - 定義主機資訊:使用字典來儲存主機的相關資訊,包括主機名稱、使用者名稱和密碼。
- 取得網路驅動程式:透過
napalm.get_network_driver("ios")取得Cisco IOS裝置的驅動程式。 - 連線裝置:使用取得的驅動程式和主機資訊來連線裝置。
- 開啟連線:呼叫
connect.open()開啟與裝置的連線。 - 取得介面資訊:使用
connect.get_interfaces()函式來取得裝置的介面資訊。 - 列印輸出結果:將取得的介面資訊轉換為JSON格式,並以縮排格式列印出來,以便閱讀。
- 關閉連線:最後,使用
connect.close()關閉與裝置的連線。
收集路由資訊
除了介面資訊之外,NAPALM還可以收集路由資訊。例如,可以使用get_route_to函式來取得到特定目的地的路由資訊。
程式碼範例
output = connect.get_route_to("192.168.10.30")
print(json.dumps(output, indent=1))
內容解密:
- 取得路由資訊:使用
connect.get_route_to("192.168.10.30")函式來取得到目的IP位址192.168.10.30的路由資訊。 - 列印輸出結果:將取得的路由資訊轉換為JSON格式,並列印出來。
網路自動化工具:NAPALM 與 Nornir 的應用
使用 NAPALM 收集裝置資訊
在網路自動化的領域中,NAPALM 是一個強大的工具,能夠幫助網路管理員收集和分析網路裝置的資訊。以下是一個使用 NAPALM 收集多台裝置 ARP 表格資訊的範例。
範例 5.13:使用 NAPALM 從多台裝置收集日誌
import napalm
import json
ip_list = ["10.10.10.1", "10.10.10.2", "10.10.10.3"]
for ip in ip_list:
print(f"*** 連線到 {ip} ***")
host = {"hostname": ip, "username": "admin", "password": "cisco"}
driver = napalm.get_network_driver("ios")
connect = driver(**host)
connect.open()
output = connect.get_arp_table()
print(json.dumps(output, indent=1))
connect.close()
內容解密:
- 匯入必要的模組:首先,我們匯入
napalm和json模組。napalm用於與網路裝置互動,而json用於格式化輸出。 - 定義裝置 IP 清單:我們定義了一個包含三個裝置 IP 位址的清單
ip_list。 - 迴圈連線裝置:使用
for迴圈遍歷ip_list中的每個 IP 位址,並使用 NAPALM 連線到裝置。 - 取得 ARP 表格:透過
connect.get_arp_table()方法取得裝置的 ARP 表格資訊。 - 輸出結果:使用
json.dumps()將 ARP 表格資訊格式化輸出。
使用 NAPALM 組態裝置
除了收集資訊,NAPALM 也可用於組態網路裝置。以下範例展示如何使用 NAPALM 組態 BGP。
範例 5.14:使用 NAPALM 組態動態路由
import napalm
host = {"hostname": "10.10.10.1", "username": "admin", "password": "cisco"}
driver = napalm.get_network_driver("ios")
connect = driver(**host)
connect.open()
output = connect.load_merge_candidate(filename="command_list.txt")
print(connect.compare_config())
connect.commit_config()
connect.close()
內容解密:
- 載入組態檔案:使用
load_merge_candidate()方法載入組態檔案command_list.txt。 - 比較組態差異:透過
compare_config()方法比較當前組態與新組態的差異。 - 提交組態:使用
commit_config()方法將新組態提交到裝置。
Nornir 網路自動化框架
Nornir 是另一個流行的網路自動化框架,它允許使用純 Python 程式碼編寫自動化指令碼。
Nornir 的特點
- 多執行緒功能,能夠同時連線多台裝置。
- 支援使用 NAPALM、Netmiko 等模組連線裝置。
- 使用 YAML 檔案管理裝置清單。
組態 Nornir 的裝置清單
# hosts.yaml
---
Router-1:
hostname: 10.10.10.1
platform: ios
username: admin
password: cisco
Router-2:
hostname: 10.10.10.2
platform: ios
username: admin
password: cisco
Router-3:
hostname: 10.10.10.3
platform: ios
username: admin
password: cisco
內容解密:
- 定義裝置資訊:在
hosts.yaml檔案中定義了三台裝置的資訊,包括主機名、平台、使用者名稱和密碼。 - 簡化裝置管理:透過將裝置資訊集中管理,簡化了自動化指令碼的編寫和維護。
Nornir 框架在網路自動化中的應用
Nornir 是一個強大的 Python 框架,用於簡化網路自動化任務。它支援多種外掛程式,如 Nornir-Netmiko 和 Nornir-NAPALM,能夠與不同的網路裝置進行互動。本文將探討 Nornir 的基本組態、使用方法以及如何利用它來自動化網路任務。
組態 Nornir
在使用 Nornir 之前,需要進行一些基本組態。這包括定義裝置清單、群組和預設值。這些組態通常儲存在 YAML 檔案中。
hosts.yaml
Router-1:
hostname: 10.10.10.1
groups:
- ios
Router-2:
hostname: 10.10.10.2
groups:
- ios
Router-3:
hostname: 10.10.10.3
groups:
- ios
groups.yaml
ios:
platform: "ios"
junos:
platform: "junos"
defaults.yaml
username: admin
password: cisco
config.yaml
inventory:
plugin: SimpleInventory
options:
host_file: "hosts.yaml"
group_file: "groups.yaml"
defaults_file: "defaults.yaml"
runner:
plugin: threaded
options:
num_workers: 3
在 config.yaml 中,我們定義了庫存外掛程式和執行器外掛程式。SimpleInventory 外掛程式用於載入 YAML 檔案,而 threaded 外掛程式則啟用了多執行緒功能,允許同時連線到多個裝置。
使用 Nornir-Netmiko 連線裝置
Nornir-Netmiko 是 Nornir 的一個外掛程式,允許使用 Netmiko 函式庫連線到網路裝置。以下是一個範例,展示如何使用 Nornir-Netmiko 從 Cisco 裝置收集 show arp 命令的輸出。
from nornir import InitNornir
from nornir_utils.plugins.functions import print_result
from nornir_netmiko import netmiko_send_command
# 初始化 Nornir
connect = InitNornir(config_file="config.yaml")
# 執行命令
result = connect.run(task=netmiko_send_command, command_string="show arp")
# 列印結果
print_result(result)
程式碼解析:
- 匯入必要的模組:匯入
InitNornir、print_result和netmiko_send_command。 - 初始化 Nornir:使用
InitNornir初始化 Nornir,並指定config.yaml作為組態檔案。 - 執行命令:使用
connect.run方法執行netmiko_send_command任務,並指定要執行的命令為show arp。 - 列印結果:使用
print_result方法列印命令執行的結果。
使用 Nornir-NAPALM 連線裝置
Nornir-NAPALM 是另一個外掛程式,允許使用 NAPALM 函式庫連線到網路裝置。以下是一個範例,展示如何使用 Nornir-NAPALM 在 Cisco 裝置上儲存組態。
from nornir import InitNornir
from nornir_utils.plugins.functions import print_result
from nornir_napalm.plugins.tasks import napalm_cli
# 初始化 Nornir
connect = InitNornir(config_file="config.yaml")
# 執行命令
result = connect.run(task=napalm_cli, commands=["write"])
# 列印結果
print_result(result)
程式碼解析:
- 匯入必要的模組:匯入
InitNornir、print_result和napalm_cli。 - 初始化 Nornir:使用
InitNornir初始化 Nornir,並指定config.yaml作為組態檔案。 - 執行命令:使用
connect.run方法執行napalm_cli任務,並指定要執行的命令為write。 - 列印結果:使用
print_result方法列印命令執行的結果。
篩選裝置
Nornir 允許根據特定的條件篩選裝置。例如,可以根據主機名篩選特定的裝置。
from nornir import InitNornir
from nornir_utils.plugins.functions import print_result
from nornir_netmiko import netmiko_send_command
# 初始化 Nornir
connect = InitNornir(config_file="config.yaml")
# 篩選裝置
filtered_connect = connect.filter(hostname="10.10.10.2")
# 執行命令
result = filtered_connect.run(task=netmiko_send_command, command_string="show arp")
# 列印結果
print_result(result)
程式碼解析:
- 匯入必要的模組:匯入
InitNornir、print_result和netmiko_send_command。 - 初始化 Nornir:使用
InitNornir初始化 Nornir,並指定config.yaml作為組態檔案。 - 篩選裝置:使用
filter方法根據主機名篩選特定的裝置。 - 執行命令:使用
filtered_connect.run方法執行netmiko_send_command任務,並指定要執行的命令為show arp。 - 列印結果:使用
print_result方法列印命令執行的結果。