我時常需要從 Ansible 的輸出結果中提取裝置的執行時間資訊,以便監控網路健康狀況。然而,Ansible 的輸出通常包含大量雜訊,人工解析既費時又容易出錯。因此,我開發了一套 Python 自動化方案,可以有效解析 Ansible 輸出、提取執行時間,並利用圖表清晰地呈現出來。
首先,我們需要處理 Ansible 輸出的原始資料,這通常是一個包含多個裝置資訊的字串。以下是一個範例:
# ... (Ansible 輸出範例,內容略)
我使用正規表示式來精確比對每個裝置的執行時間資訊。這需要仔細設計正規表示式,確保能正確捕捉目標資料,同時忽略其他無關資訊。
import re
ansible_output = """
# ... (Ansible 輸出範例,內容略)
"""
uptime_data = {}
for line in ansible_output.splitlines():
match = re.search(r"ok: \[(.*?)\] =>", line)
if match:
hostname = match.group(1)
uptime_match = re.search(r"uptime is (.*?)\n", ansible_output)
if uptime_match:
uptime_str = uptime_match.group(1)
uptime_data[hostname] = uptime_str
這段程式碼逐行掃描 Ansible 輸出。我利用 re.search
搜尋主機名稱和執行時間。找到比對項後,將主機名稱和對應的執行時間字串儲存到 uptime_data
字典中。
接著,我將執行時間字串轉換為小時,方便後續的分析和視覺化。
def uptime_to_hours(uptime_str):
# ... (程式碼內容與前文相同,略)
uptime_to_hours
函式將 “7 weeks, 1 day, 4 hours, 43 minutes” 這樣的字串轉換為總小時數。它解析星期、天、小時和分鐘,並計算總和。
最後,我使用 Pandas 和 Matplotlib 將資料視覺化。
import pandas as pd
import matplotlib.pyplot as plt
# ... (程式碼內容與前文相同,略)
這段程式碼將 uptime_hours
字典轉換為 Pandas DataFrame,然後使用 Matplotlib 繪製長條圖。圖表清晰地顯示了每個裝置的執行時間。
graph LR B[B] D[D] A[收集 Ansible 輸出] --> B{使用正規表示式提取 Uptime}; B --> C[轉換 Uptime 為小時]; C --> D{建立 Pandas DataFrame}; D --> E[繪製 Matplotlib 圖表];
**圖表説明:**此流程圖展示了從 Ansible 輸出提取裝置執行時間並視覺化的完整流程。
graph LR C[C] E[E] subgraph 資料處理 A[讀取 Ansible 輸出] --> B(正規表示式比對); B --> C{提取執行時間}; C --> D[轉換為小時]; end subgraph 資料視覺化 D --> E{建立 DataFrame}; E --> F[繪製圖表]; end
**圖表説明:**此流程圖更細緻地展現了資料處理和視覺化的步驟。
透過這套 Python 自動化方案,我可以快速與準確地從 Ansible 輸出中提取裝置執行時間資訊,並以圖表形式呈現,大幅提升了網路監控效率。這是我在網路自動化領域的實踐經驗分享,希望能對你有所幫助。
在現今高度互聯的環境下,網路裝置的穩定性至關重要。任何網路中斷都可能造成業務停擺和重大損失。因此,建構一套可靠的網路監控系統,能夠及時發現問題並發出警示,是確保網路穩定執行的關鍵。本文將介紹如何使用 Python 結合 Sendmail,開發一個網路監控哨兵,實作自動化的連線狀態偵測和郵件告警通知。
我將引導你逐步建構這個系統,從 Sendmail 的 Docker 佈署與設定開始,接著撰寫 Python 監控指令碼,最後整合兩者,實作完整的郵件告警功能。過程中,我會分享一些實務經驗和技巧,幫助你更好地理解和應用這些技術。
利用 Docker 佈署 Sendmail
首先,我們使用 Docker 容器化 Sendmail 服務,這能提供一個獨立與乾淨的執行環境,避免與主機系統的設定衝突,也更易於管理和維護。以下步驟説明如何在 Docker 中安裝和組態 Sendmail:
docker run -d --name my-sendmail -p 25:25 -p 587:587 namshi/sendmail
這個指令會下載 namshi/sendmail
映像檔並啟動一個名為 my-sendmail
的容器。-d
引數讓容器在背景執行,-p
引數將容器的 25 和 587 埠對映到主機的對應埠,以便 Sendmail 可以接收和傳送郵件。這個方法比直接在主機安裝 Sendmail 更簡潔高效。
Python 監控指令碼的建構
接下來,我們使用 Python 撰寫監控指令碼。這個指令碼會定期檢查目標網路裝置的連線狀態,並在偵測到連線中斷時,透過 Sendmail 傳送告警郵件。
import smtplib
from email.mime.text import MIMEText
import socket
import time
# 郵件設定
sender_email = "your_sender_email@gmail.com" # 你的 Gmail 帳號
recipient_email = "your_recipient_email@example.com" # 收件人信箱
password = "your_gmail_app_password" # 你的 Gmail 應用程式密碼
subject = "網路裝置離線告警"
# SMTP 伺服器設定
smtp_server = "smtp.gmail.com"
smtp_port = 587
# 監控目標設定
target_host = "your_target_host" # 你要監控的主機
target_port = 22 # 你要監控的埠
# 監控迴圈
offline_count = 0
while True:
try:
# 嘗試連線目標主機
socket.create_connection((target_host, target_port), 2)
print(f"{target_host}:{target_port} 可達")
offline_count = 0 # 重置離線計數
except OSError:
print(f"{target_host}:{target_port} 無法連線")
offline_count += 1
if offline_count >= 3: # 連續 3 次無法連線,傳送郵件
try:
msg = MIMEText(f"{target_host}:{target_port} 已離線")
msg['Subject'] = subject
msg['From'] = sender_email
msg['To'] = recipient_email
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.starttls()
server.login(sender_email, password)
server.send_message(msg)
print("告警郵件已傳送!")
offline_count = 0 # 避免重複傳送郵件,直到還原連線
except Exception as e:
print(f"郵件傳送失敗: {e}")
time.sleep(10) # 每 10 秒檢查一次
這段程式碼的核心邏輯是使用 socket.create_connection()
嘗試連線目標主機和埠。如果連線失敗,offline_count
計數器會遞增。當計數器達到 3 時,會透過 smtplib
傳送告警郵件。我調整了重試次數和間隔時間,使其更符合實際應用場景。同時,加入了錯誤處理機制,避免程式因為郵件傳送失敗而中斷。
sequenceDiagram participant 監控指令碼 participant Sendmail 容器 participant 郵件伺服器 participant 使用者 監控指令碼->>Sendmail 容器: 傳送郵件請求 Sendmail 容器->>郵件伺服器: 轉發郵件 郵件伺服器->>使用者: 傳送告警郵件
圖表説明: 這個序列圖清晰地展現了監控指令碼、Sendmail 容器、郵件伺服器和使用者之間的互動流程,讓讀者更容易理解整個告警流程。
這個網路監控哨兵可以幫助你及時發現網路問題,並透過郵件通知你採取行動,有效提升網路穩定性和安全性。未來,你可以進一步擴充套件這個系統,例如加入更多監控指標、整合其他告警方式,開發更全面的網路監控解決方案。
身為一個技術愛好者,我經常思考如何利用程式碼解決生活中的問題。網路連線的穩定性一直是我們關注的焦點,尤其在伺服器管理和重要網路裝置的監控上,更是容不得半點閃失。因此,我決定開發一個能夠自動偵測網路連線狀態,並在斷線時即時傳送告警的系統。
在這個專案中,我選擇了 Python 作為主要的開發語言,並結合 Sendmail 實作郵件告警功能。Python 的簡潔易用和豐富的網路程式函式庫,讓網路程式開發變得更加輕鬆;而 Sendmail 則是一個可靠與廣泛使用的郵件傳輸代理,可以確保告警訊息能夠及時送達。
核心程式碼解析
以下是我設計的核心程式碼片段:
import socket
import smtplib
import time
from email.mime.text import MIMEText
# 設定目標主機和埠號
target_host = "your_target_host"
target_port = 80 # 或其他您需要監控的埠號
# 設定郵件伺服器和帳號資訊
mail_host = "your_mail_host"
mail_user = "your_mail_user"
mail_pass = "your_mail_password"
sender = "your_sender_email"
receivers = ["your_receiver_email"]
# 設定離線計數器和閾值
offline_count = 0
offline_threshold = 10 # 連續 10 次連線失敗則視為離線
while True:
try:
# 嘗試連線目標主機
socket.create_connection((target_host, target_port), timeout=5)
offline_count = 0 # 連線成功,重置離線計數
print(f"連線到 {target_host}:{target_port} 成功")
except (socket.timeout, ConnectionRefusedError, OSError) as e:
offline_count += 1 # 連線失敗,增加離線計數
print(f"連線到 {target_host}:{target_port} 失敗: {e}")
if offline_count >= offline_threshold:
# 離線計數達到閾值,傳送告警郵件
message = MIMEText(f"{target_host}:{target_port} 離線!", 'plain', 'utf-8')
message['Subject'] = f"{target_host}:{target_port} 離線告警"
message['From'] = sender
message['To'] = ", ".join(receivers)
try:
with smtplib.SMTP_SSL(mail_host) as smtp:
smtp.login(mail_user, mail_pass)
smtp.sendmail(sender, receivers, message.as_string())
print("告警郵件已傳送")
offline_count = 0 # 重置離線計數
except smtplib.SMTPException as e:
print(f"郵件傳送失敗: {e}")
time.sleep(6) # 每 6 秒檢查一次
這段程式碼的核心邏輯是利用 socket.create_connection()
函式嘗試連線到指定的目標主機和埠號。我設定了一個 offline_count
變數來追蹤連線失敗的次數。如果連線成功,則將 offline_count
重置為 0;如果連線失敗,則遞增 offline_count
。當 offline_count
達到預設的閾值 offline_threshold
時,就會觸發郵件傳送程式,透過 Sendmail 將告警訊息傳送到指定的收件人信箱。我還加入了錯誤處理機制,以應對各種網路異常狀況,並使用 time.sleep()
控制檢查頻率。
graph LR B[B] F[F] A[開始] --> B{檢查網路連線}; B -- 連線成功 --> C[重置離線計數]; C --> D[等待 6 秒]; D --> B; B -- 連線失敗 --> E[增加離線計數]; E --> F{離線計數 >= 10?}; F -- 是 --> G[傳送告警郵件]; G --> C; F -- 否 --> D;
**圖表説明:**這個流程圖簡潔地展示了網路監控指令碼的執行流程,包含網路連線檢查、離線計數的更新,以及郵件告警的觸發條件。
序列圖
sequenceDiagram participant Python指令碼 participant 目標主機 participant Sendmail伺服器 Python指令碼->>目標主機: 嘗試連線 (目標埠) alt 連線成功 目標主機-->>Python指令碼: 連線成功 Python指令碼->>Python指令碼: 重置 offline_count else 連線失敗 目標主機-->>Python指令碼: 連線失敗 Python指令碼->>Python指令碼: 增加 offline_count loop offline_count >= 10? Python指令碼->>Sendmail伺服器: 傳送告警郵件 Sendmail伺服器-->>Python指令碼: 郵件傳送成功 Python指令碼->>Python指令碼: 重置 offline_count end end Python指令碼->>Python指令碼: 等待 6 秒
**圖表説明:**這個序列圖詳細地描述了 Python 指令碼、目標主機和 Sendmail 伺服器之間的互動過程,清晰地展現了訊息傳遞的順序和條件判斷邏輯。
我的實務經驗分享
在我過去的專案經驗中,我發現網路監控系統的價值不僅在於及時發現問題,更在於預防問題的發生。透過持續監控網路裝置的連線狀態,我們可以及早發現潛在的網路問題,例如網路壅塞、裝置故障等,並在問題惡化之前採取必要的措施。
這個 Python 網路監控系統的設計理念是簡潔、高效與易於擴充套件。透過這個系統,我們可以有效地保障網路連線的穩定性,減少網路故障帶來的損失。我相信,這個系統可以廣泛應用於各種網路環境,為網路管理者提供強大的支援。