網路裝置的介面統計資料是網路管理的關鍵指標。本文介紹如何利用 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
內容解密:
fetch_router_interface_stats函式:負責連線指定的網路裝置,擷取介面資訊,並呼叫parse_interface_details進行資料解析。parse_interface_details函式:使用正規表示式解析介面資訊中的關鍵資料,如介面描述、可靠性、傳輸和接收負載等。- 正規表示式的使用:正規表示式用於匹配和提取介面資訊中的特定模式,如介面描述和傳輸負載等。
- 資料儲存:將解析出的統計資料儲存在字典中,以便後續處理。
多執行緒技術的應用
為了提高資料擷取的效率,我們採用多執行緒技術同時連線多台網路裝置。以下是一個範例函式 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()
內容解密:
fetch_stats_multithread函式:負責初始化多執行緒任務,將裝置列表分成最多 25 個一組的子列表。- 多執行緒的建立與啟動:為每個子列表中的裝置建立一個執行緒,並啟動這些執行緒以平行擷取資料。
- 執行緒同步:使用
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
內容解密:
- Splunk 查詢語法:使用 Splunk 的查詢語言對匯入的資料進行篩選和聚合。
where子句:用於過濾出符合特定條件的資料,如interface_name="Loopback45"。dedup子句:用於去除重複的資料記錄,確保結果的唯一性。stats子句:用於對資料進行聚合計算,如取得interface_name和interface_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")
程式碼解析
- Splunk 連線設定:首先,我們需要設定 Splunk 的連線引數,包括 IP 地址、埠、使用者名稱和密碼。
- 路由器 IP 對照表:定義一個字典來儲存路由器名稱與其對應的 IP 地址。
- Splunk 查詢:使用 Splunk 的查詢語言來檢索介面狀態為 down 的路由器介面。
- 自動修復:對於查詢結果中狀態為 down 的介面,使用 Netmiko 連線到對應的路由器並執行修復命令。
- 驗證修復結果:修復後,再次查詢介面狀態以確認是否修復成功。
大規模網路裝置組態稽核
在大規模網路環境中,確保所有裝置的組態符合標準化要求是一項挑戰。我們可以透過解析 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("稽核結果:")
# 省略輸出邏輯
程式碼解析
- XML 範本解析:使用
lxml函式庫解析 XML 範本,提取出標準組態。 - 取得實際組態:使用 Netmiko 連線到路由器,取得實際的執行組態。
- 比對組態差異:將標準組態與實際組態進行比對,找出需要修正的組態。
- 輸出稽核結果:輸出稽核結果,包括需要修正的組態專案。
網路自動化稽核與聊天機器人整合應用
自動化稽核指令碼實作與解析
在網路自動化領域中,持續整合(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)
內容解密:
- 組態解析:
parseconfig(deviceconfig)函式將從網路裝置取得的執行組態解析成多個組態段,每個段代表一個特定的組態部分,如某個介面的組態。 - 介面組態檢查:遍歷解析後的組態段,檢查每個介面的組態是否符合基準組態(
LP_MetaData)。 validateconfig函式:進行兩次比較,一次是基準組態對實際組態,另一次是實際組態對基準組態。這樣可以找出需要新增或刪除的組態行。- 輸出結果標記:
+表示基準組態中存在但實際組態中缺失的行。-表示實際組態中存在但基準組態中不存在的行,建議刪除以符合基準組態。*ignore表示某些被忽略的組態行,如shutdown或特定的ip address組態。
聊天機器人整合應用
為了提高網路維運的靈活性,可以將自動化指令碼與聊天機器人(如Slack上的機器人)整合,實作透過聊天介面觸發自動化任務。
建立Slack聊天機器人步驟
- 建立Slack工作區和應用:在Slack上建立工作區和應用,並為應用新增機器人功能。
- 設定事件訂閱:組態事件訂閱,將聊天訊息轉發到外部API。
- 驗證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 = ""
內容解密:
on_get和on_post方法:處理來自Slack的GET和POST請求。- 驗證邏輯:在
on_post方法中,解析請求資料中的challenge欄位,並將其原樣傳回,以完成Slack的端點驗證。
透過將自動化稽核指令碼與Slack聊天機器人整合,網路工程師可以在移動中執行各種任務,提高了維運的效率和靈活性。