返回文章列表

網路裝置介面統計資料擷取與 Splunk 整合

本文探討如何使用 Python 指令碼結合多執行緒技術,高效擷取多台網路裝置的介面統計資料,並將資料匯入 Splunk 進行視覺化分析,同時也涵蓋了利用 Splunk 進行網路裝置監控和自動修復,以及大規模網路裝置組態稽核的實務方法,最後示範如何整合 Slack 聊天機器人,提升網路維運效率。

網路管理 資料分析

網路裝置的介面統計資料是網路管理的關鍵指標。本文介紹如何利用 Python 指令碼,結合多執行緒技術,從多台網路裝置高效地擷取這些資料。指令碼中使用正規表示式解析裝置回傳的資訊,提取關鍵統計資料,例如介面描述、可靠性、傳輸負載等,並將這些資料整理成結構化資料。為了提升擷取效率,採用多執行緒技術,可以同時連線多台裝置,平行處理資料擷取任務。最後,將擷取到的資料匯入 Splunk 平台,進行更深入的分析和視覺化呈現,以便網路管理員快速掌握網路裝置的執行狀態。

網路裝置介面統計資料擷取與 Splunk 整合實務

在現代化的網路管理中,持續收集和分析網路裝置的介面統計資料對於監控網路健康狀態、預測潛在問題以及最佳化網路效能至關重要。本文將探討如何透過 Python 指令碼結合多執行緒技術,實作對多台網路裝置介面統計資料的高效擷取,並將這些資料匯入 Splunk 進行進一步的分析和視覺化。

介面統計資料擷取指令碼解析

首先,我們需要一個能夠連線網路裝置、擷取介面統計資料並進行解析的 Python 指令碼。以下是一個範例函式 fetch_router_interface_stats,它負責連線到指定的路由器,擷取介面資訊,並解析出關鍵的統計資料。

import re

def fetch_router_interface_stats(device_type, device_ip, username, password, timestamp):
    # 連線網路裝置並擷取介面資訊
    interface_details = connect_and_fetch(device_type, device_ip, username, password)
    
    # 解析介面資訊
    stats = parse_interface_details(interface_details, device_ip, timestamp)
    
    return stats

def parse_interface_details(interface_details, device_ip, timestamp):
    stats = {}
    # 使用正規表示式解析介面資訊
    m = re.search('Description: ([a-zA-Z0-9_ -:]*)', interface_details)
    if m:
        interface_description = m.group(1).strip()
    else:
        interface_description = 'NULL'
        
    # 解析其他介面統計資料,如可靠性、傳輸負載、接收負載、頻寬等
    # ...
    
    # 將解析出的資料存入字典
    stats['interface_description'] = interface_description
    stats['reliability'] = reliability
    stats['txload'] = txload
    stats['rxload'] = rxload
    stats['bandwidth'] = bandwidth
    # ...
    
    return stats

內容解密:

  1. fetch_router_interface_stats 函式:負責連線指定的網路裝置,擷取介面資訊,並呼叫 parse_interface_details 進行資料解析。
  2. parse_interface_details 函式:使用正規表示式解析介面資訊中的關鍵資料,如介面描述、可靠性、傳輸和接收負載等。
  3. 正規表示式的使用:正規表示式用於匹配和提取介面資訊中的特定模式,如介面描述和傳輸負載等。
  4. 資料儲存:將解析出的統計資料儲存在字典中,以便後續處理。

多執行緒技術的應用

為了提高資料擷取的效率,我們採用多執行緒技術同時連線多台網路裝置。以下是一個範例函式 fetch_stats_multithread,它負責初始化多執行緒任務,並確保最多同時執行 25 個執行緒。

import threading
import time
import random

def fetch_stats_multithread(all_ips, device_type, username, password, timestamp):
    sub_lists = split_list(all_ips, 25)
    for sub_list in sub_lists:
        threads = []
        for device_ip in sub_list:
            t = threading.Thread(target=fetch_router_interface_stats, args=(device_type, device_ip, username, password, timestamp))
            t.start()
            time.sleep(random.randrange(1, 2, 1) / 20)
            threads.append(t)
        for t in threads:
            t.join()

內容解密:

  1. fetch_stats_multithread 函式:負責初始化多執行緒任務,將裝置列表分成最多 25 個一組的子列表。
  2. 多執行緒的建立與啟動:為每個子列表中的裝置建立一個執行緒,並啟動這些執行緒以平行擷取資料。
  3. 執行緒同步:使用 join 方法等待所有執行緒完成,確保資料擷取任務的完整性。

Splunk 資料匯入與視覺化

將擷取的介面統計資料匯入 Splunk 後,我們可以利用 Splunk 的強大查詢和分析功能進行資料視覺化。以下是一個範例查詢,用於顯示所有路由器的 Loopback45 介面的最新狀態。

index="main" | where interface_name="Loopback45" | dedup interface_name, router_name | stats values(interface_name) values(interface_status) by router_name

內容解密:

  1. Splunk 查詢語法:使用 Splunk 的查詢語言對匯入的資料進行篩選和聚合。
  2. where 子句:用於過濾出符合特定條件的資料,如 interface_name="Loopback45"
  3. dedup 子句:用於去除重複的資料記錄,確保結果的唯一性。
  4. stats 子句:用於對資料進行聚合計算,如取得 interface_nameinterface_status 的值。

連續整合 Chapter 6:自動化網路裝置管理與稽核

在現代網路管理中,連續整合(Continual Integration)扮演著至關重要的角色,特別是在需要即時監控和自動修復網路裝置的場景中。本章將探討如何利用 Splunk 進行日誌收集和分析,以及如何透過自動化指令碼實作網路裝置的自動修復和組態稽核。

利用 Splunk 進行網路裝置監控與自動修復

首先,我們需要設定 Splunk 來收集網路裝置的日誌資料。Splunk 是一個強大的資料分析平台,可以幫助我們即時監控網路裝置的狀態。在本例中,我們將使用 Splunk 來監控路由器介面的狀態,並在介面狀態變為 down 時自動進行修復。

自動修復指令碼

以下是一個 Python 指令碼範例,用於查詢 Splunk 中的介面狀態,並在發現介面 down 時自動修復:

import splunklib.client as client
import splunklib.results as results
import requests
import warnings
from urllib.parse import unquote
from netmiko import ConnectHandler
warnings.filterwarnings("ignore")

# Splunk 連線設定
HOST = "<splunk IP address>"
PORT = 8089
USERNAME = "username"
PASSWORD = "password"

# 路由器 IP 對照表
device_name = {}
device_name['rtr1'] = "192.168.20.1"
device_name['rtr2'] = "192.168.20.2"
device_name['rtr3'] = "192.168.20.3"
device_name['rtr4'] = "192.168.20.4"

# 建立 Splunk Service 例項並登入
service = client.connect(
    host=HOST,
    port=PORT,
    username=USERNAME,
    password=PASSWORD)

# 定義查詢引數
kwargs_oneshot = {"earliest_time": "-120d@d", "count": 10}
url = """search index="main" | where interface_name="Loopback45" | dedup interface_name,router_name | stats values(interface_name) values(interface_status) by router_name"""

# 執行查詢並取得結果
oneshotsearch_results = service.jobs.oneshot(url, **kwargs_oneshot)
reader = results.ResultsReader(oneshotsearch_results)

# 處理查詢結果並進行自動修復
for item in reader:
    if ("up" not in item['values(interface_status)']):
        print("\nIssue found in %s " % (item['router_name']))
        print("Remediation in progress....")
        device = ConnectHandler(device_type='cisco_ios', ip=device_name[item['router_name']], username='test', password='test')
        remediateconfig = ["interface loopback 45", "no shut"]
        device.send_config_set(remediateconfig)
        
        # 驗證修復結果
        output = device.send_command("show interfaces loopback 45")
        if ("line protocol is up" in output):
            print("Remediation succeeded. Interface is now back to normal")
        else:
            print("Remediation Failed. Need to manually validate\n")

程式碼解析

  1. Splunk 連線設定:首先,我們需要設定 Splunk 的連線引數,包括 IP 地址、埠、使用者名稱和密碼。
  2. 路由器 IP 對照表:定義一個字典來儲存路由器名稱與其對應的 IP 地址。
  3. Splunk 查詢:使用 Splunk 的查詢語言來檢索介面狀態為 down 的路由器介面。
  4. 自動修復:對於查詢結果中狀態為 down 的介面,使用 Netmiko 連線到對應的路由器並執行修復命令。
  5. 驗證修復結果:修復後,再次查詢介面狀態以確認是否修復成功。

大規模網路裝置組態稽核

在大規模網路環境中,確保所有裝置的組態符合標準化要求是一項挑戰。我們可以透過解析 XML 範本來定義標準組態,並與實際組態進行比對,以找出需要修正的組態。

XML 範本定義

以下是一個 XML 範本範例,用於定義 Loopback45 和 Loopback30 介面的標準組態:

<DescriptionProfiles>
    <description id="Loopback45">
        <configuration>description Security;switchport access vlan;switchport mode access;spanning-tree portfast</configuration>
    </description>
    <description id="Loopback30">
        <configuration>description Printer;switchport access vlan;switchport mode access;spanning-tree portfast</configuration>
    </description>
</DescriptionProfiles>

組態稽核指令碼

以下是一個 Python 指令碼範例,用於解析 XML 範本並與實際組態進行比對:

from lxml import etree
from netmiko import ConnectHandler
import itertools

# 解析 XML 範本
def read_xml_metadata(link_profiles="LinkDescriptionProfiles.xml"):
    LP_MetaData = dict()
    try:
        lp_hnd = open(link_profiles, "r")
    except IOError as io_error:
        print(io_error)
        sys.exit()
    lp_data = lp_hnd.read()
    lp_hnd.close()
    lp_xml_tree = etree.fromstring(lp_data)
    lp_check_id = lp_xml_tree.xpath("/DescriptionProfiles/description/@id")
    lp_check_config = lp_xml_tree.xpath("/DescriptionProfiles/description/configuration")
    lp_lam = lambda config, name, LP_MetaData: LP_MetaData.update({name: config.split(";")})
    [lp_lam(config.text, name, LP_MetaData) for name, config in zip(lp_check_id, lp_check_config)]
    return LP_MetaData

LP_MetaData = read_xml_metadata()

# 連線到路由器並取得實際組態
device = ConnectHandler(device_type='cisco_ios', ip="192.168.20.1", username='test', password='test')
config = device.send_command("show run")

# 比對組態差異
def validateconfig(config1, config2, typeconfig):
    # 省略比對邏輯
    pass

# 輸出稽核結果
print("稽核結果:")
# 省略輸出邏輯

程式碼解析

  1. XML 範本解析:使用 lxml 函式庫解析 XML 範本,提取出標準組態。
  2. 取得實際組態:使用 Netmiko 連線到路由器,取得實際的執行組態。
  3. 比對組態差異:將標準組態與實際組態進行比對,找出需要修正的組態。
  4. 輸出稽核結果:輸出稽核結果,包括需要修正的組態專案。

網路自動化稽核與聊天機器人整合應用

自動化稽核指令碼實作與解析

在網路自動化領域中,持續整合(Continual Integration)是確保網路裝置組態一致性和合規性的重要手段。以下是一個根據Python的自動化稽核指令碼,用於檢查網路裝置的組態是否符合預定的基準組態。

程式碼解析

tmpval=tmpval+" + [{}]\n".format(line)
else:
    for ignorecommand in ignorecommandlist:
        if (ignorecommand in line):
            ignore=True
    if (ignore):
        ignore=False
        tmpval=tmpval+" *ignore [{}]\n".format(line)
    else:
        tmpval=tmpval+" - [{}]\n".format(line)
return tmpval

ip="192.168.20.{0}".format(1)
print ("\nValidating for IP address ",ip)
device = ConnectHandler(device_type='cisco_ios', ip=ip, username='test', password='test')
deviceconfig = device.send_command("show run")
parsedconfig=parseconfig(deviceconfig)

#### 驗證基準組態與實際組態的一致性
for interfaceconfig in parsedconfig:
    if ("interface " in interfaceconfig[0]):
        interfacename=interfaceconfig[0].split(' ')
        interface_name=None
        interface_name = [x for x in LP_MetaData.keys() if x.strip() == interfacename[1]]
        
        if (len(interface_name) > 0 ):
            print (interface_name)
            getbaseconfig=LP_MetaData[interface_name[0]]
            returnval=validateconfig(getbaseconfig,interfaceconfig,"baseconfig")
            print (returnval)
            returnval=validateconfig(interfaceconfig,getbaseconfig,"fetchedconfig")
            print (returnval)

內容解密:

  1. 組態解析parseconfig(deviceconfig)函式將從網路裝置取得的執行組態解析成多個組態段,每個段代表一個特定的組態部分,如某個介面的組態。
  2. 介面組態檢查:遍歷解析後的組態段,檢查每個介面的組態是否符合基準組態(LP_MetaData)。
  3. validateconfig函式:進行兩次比較,一次是基準組態對實際組態,另一次是實際組態對基準組態。這樣可以找出需要新增或刪除的組態行。
  4. 輸出結果標記
    • + 表示基準組態中存在但實際組態中缺失的行。
    • - 表示實際組態中存在但基準組態中不存在的行,建議刪除以符合基準組態。
    • *ignore 表示某些被忽略的組態行,如 shutdown 或特定的 ip address 組態。

聊天機器人整合應用

為了提高網路維運的靈活性,可以將自動化指令碼與聊天機器人(如Slack上的機器人)整合,實作透過聊天介面觸發自動化任務。

建立Slack聊天機器人步驟

  1. 建立Slack工作區和應用:在Slack上建立工作區和應用,並為應用新增機器人功能。
  2. 設定事件訂閱:組態事件訂閱,將聊天訊息轉發到外部API。
  3. 驗證API端點:Slack會向組態的API端點傳送驗證請求,端點需要正確回應以完成驗證。

Python程式碼實作Slack機器人驗證

import falcon
import json

def on_get(self, req, resp):
    resp.status = falcon.HTTP_200
    resp.body = json.dumps({"Server is Up!"})

def on_post(self, req, resp):
    data = req.bounded_stream.read()
    try:
        data = json.loads(data)["challenge"]
        resp.status = falcon.HTTP_200
        resp.body = data
    except:
        resp.status = falcon.HTTP_200
        resp.body = ""

內容解密:

  1. on_geton_post方法:處理來自Slack的GET和POST請求。
  2. 驗證邏輯:在on_post方法中,解析請求資料中的challenge欄位,並將其原樣傳回,以完成Slack的端點驗證。

透過將自動化稽核指令碼與Slack聊天機器人整合,網路工程師可以在移動中執行各種任務,提高了維運的效率和靈活性。