網路自動化已成為現代網路管理的關鍵技術,有效提升效率並降低人為錯誤。本文介紹如何利用 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

內容解密:

  1. {% for int in interfaces %}:此行開始一個迴圈,遍歷 interfaces 列表中的每個介面。
  2. interface {{ int["int_name"] }}:輸出介面的名稱,例如 GigabitEthernet0/1
  3. description {{ int["description"] }}:設定介面的描述,例如 Service_Interface_1
  4. ip address {{ int["ip_address"] }} {{ int["subnet_mask"] }}:設定介面的 IP 地址和子網路遮罩。
  5. 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

內容解密:

  1. {% if int['active'] %}no {% endif %}shutdown:如果介面的 active 狀態為真,則輸出 no shutdown,否則輸出 shutdown
  2. {% if int['active'] %}ip access-group {{ acl_no }} in {% endif %}:如果介面為活動狀態,則套用指定的 ACL。

結果驗證

執行上述組態後,可以透過路由器的命令列介面(CLI)來驗證組態結果。例如,使用 show interfaces descriptionshow 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()

內容解密:

  1. 匯入必要的模組:首先匯入napalmjson模組。napalm用於連線網路裝置,而json用於處理JSON資料。
  2. 定義主機資訊:使用字典來儲存主機的相關資訊,包括主機名稱、使用者名稱和密碼。
  3. 取得網路驅動程式:透過napalm.get_network_driver("ios")取得Cisco IOS裝置的驅動程式。
  4. 連線裝置:使用取得的驅動程式和主機資訊來連線裝置。
  5. 開啟連線:呼叫connect.open()開啟與裝置的連線。
  6. 取得介面資訊:使用connect.get_interfaces()函式來取得裝置的介面資訊。
  7. 列印輸出結果:將取得的介面資訊轉換為JSON格式,並以縮排格式列印出來,以便閱讀。
  8. 關閉連線:最後,使用connect.close()關閉與裝置的連線。

收集路由資訊

除了介面資訊之外,NAPALM還可以收集路由資訊。例如,可以使用get_route_to函式來取得到特定目的地的路由資訊。

程式碼範例

output = connect.get_route_to("192.168.10.30")
print(json.dumps(output, indent=1))

內容解密:

  1. 取得路由資訊:使用connect.get_route_to("192.168.10.30")函式來取得到目的IP位址192.168.10.30的路由資訊。
  2. 列印輸出結果:將取得的路由資訊轉換為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()

內容解密:

  1. 匯入必要的模組:首先,我們匯入 napalmjson 模組。napalm 用於與網路裝置互動,而 json 用於格式化輸出。
  2. 定義裝置 IP 清單:我們定義了一個包含三個裝置 IP 位址的清單 ip_list
  3. 迴圈連線裝置:使用 for 迴圈遍歷 ip_list 中的每個 IP 位址,並使用 NAPALM 連線到裝置。
  4. 取得 ARP 表格:透過 connect.get_arp_table() 方法取得裝置的 ARP 表格資訊。
  5. 輸出結果:使用 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()

內容解密:

  1. 載入組態檔案:使用 load_merge_candidate() 方法載入組態檔案 command_list.txt
  2. 比較組態差異:透過 compare_config() 方法比較當前組態與新組態的差異。
  3. 提交組態:使用 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

內容解密:

  1. 定義裝置資訊:在 hosts.yaml 檔案中定義了三台裝置的資訊,包括主機名、平台、使用者名稱和密碼。
  2. 簡化裝置管理:透過將裝置資訊集中管理,簡化了自動化指令碼的編寫和維護。

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)

程式碼解析:

  1. 匯入必要的模組:匯入 InitNornirprint_resultnetmiko_send_command
  2. 初始化 Nornir:使用 InitNornir 初始化 Nornir,並指定 config.yaml 作為組態檔案。
  3. 執行命令:使用 connect.run 方法執行 netmiko_send_command 任務,並指定要執行的命令為 show arp
  4. 列印結果:使用 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)

程式碼解析:

  1. 匯入必要的模組:匯入 InitNornirprint_resultnapalm_cli
  2. 初始化 Nornir:使用 InitNornir 初始化 Nornir,並指定 config.yaml 作為組態檔案。
  3. 執行命令:使用 connect.run 方法執行 napalm_cli 任務,並指定要執行的命令為 write
  4. 列印結果:使用 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)

程式碼解析:

  1. 匯入必要的模組:匯入 InitNornirprint_resultnetmiko_send_command
  2. 初始化 Nornir:使用 InitNornir 初始化 Nornir,並指定 config.yaml 作為組態檔案。
  3. 篩選裝置:使用 filter 方法根據主機名篩選特定的裝置。
  4. 執行命令:使用 filtered_connect.run 方法執行 netmiko_send_command 任務,並指定要執行的命令為 show arp
  5. 列印結果:使用 print_result 方法列印命令執行的結果。