來源:python運維技術
在小型公司裡如果產品線單一的話,比如就一個app, 一般1~2個運維就夠用了。如果產品過於龐大,就需要多個運維人員。
但對於多產品線的公司來說,運維人員就要必須分多個人負責,因為超過200個站點讓1個人維護,那工作量是巨大的,就單單給開發的溝通時間,估計就要佔用一整天時間了。
目前我所在的公司站點非常多,為管理方便,之前我們這裡是實行過一段叫站長制的方式,就是不同人承擔不同的專案維護,每個人就是自己所負責專案的站長,這個站長制實行完後,就有個監控問題,之前只要站點有問題,是每個人都可以收到,但為了防止報警泛濫,所以就需要把監控改成故障站點只發給負責該站點的站長。
有了這個背景,我們今天就來實現這個需求,指令碼基本實現首先要有一個能夠報警的函式,還需要一個檢查站點是否故障的函式,最後一個函式是如果站點恢復後,要重新加入要監控的串列中,到這基本差不多了,但如果站點太多,用迴圈去檢查還是效率太低了點,所以我們考慮採用執行緒併發執行。
如果都想清楚了,就可以開始著手我們程式碼的編寫了。
首先匯入我們所需要的模組:
from threading import Thread
import requests
import time
import smtplib
然後定義要檢查的站點串列和報警郵件傳送人:
clients = {
"http://www.mindg.cn": "xxx@xx.com",
"http://www.google.com": "gg@gg.com",
"http://www.baidu.com": "cc@cc.com"
}
接下來實現檢查是否站點故障函式:
temp_dic = {}
def site_up():
while True:
for client, email in clients.items():
try:
r = requests.get(client)
if r.status_code == 200:
print client, 'Site ok'
time.sleep(60)
else:
print client, 'Site first registered as down - added to the "site down" monitoring'
temp_dic[client]=email
del clients[client]
except requests.ConnectionError:
print client, 'Site first registered as down - added to the "site down" monitoring'
temp_dic[client]=email
del clients[client]
這個函式就是用requests檢查站點傳回的狀態碼,如果是200就認為正常,否則就把該站點加到臨時的一個字典中,然後從檢查字典中刪除該站點。
因為站點偶爾出現問題不代表是站點問題,也可能是網路抖動,所以重新檢查站點是否故障要等待一個固定時間,實現如下:
def site_down():
while True:
time.sleep(900)
for client, email in temp_dic.items():
try:
r = requests.get(client)
if r.status_code == 200:
print client, 'Site is back up!!'
email_sender('Site back up!! ', email, client)
clients[client]=email
del temp_dic[client]
else:
email_sender('Site down!! ', email, client)
print client, 'Site Currently down - email sent'
except requests.ConnectionError:
email_sender('Site down!! ', email, client)
print client, 'Site Currently down - email sent'
這個函式就是從臨時字典中取出第一次檢查出有問題的站點,15分鐘後再次檢查,如果傳回200,就傳送郵件,並從臨時字典中移除,重新加入監控串列中,如果仍然未恢復,就要傳送報警郵件了。
最後,我們採用併發的方式執行函式:
t1 = Thread(target = site_up)
t2 = Thread(target = site_down)
t1.start()
t2.start()
如果到這裡就算結束這篇文章, 大家拿著指令碼肯定是不能執行的。
因為少程式碼,有興趣的也可以sleep 2分鐘,仔細再看看,是否發現漏掉了什麼?是的,我還沒給出發報警郵件的函式程式碼,不但沒貼而且不妨告訴大家我是故意的,之所以沒直接給呢
是因為現在報警方式太多了,我建議大家在這個指令碼基礎上進行修改實現自己想要的報警方式
就當是留個作業吧,畢竟多動手才能提高程式設計水平,其它不多說了
●編號201,輸入編號直達本文
●輸入m獲取文章目錄
Python程式設計
更多推薦《18個技術類微信公眾號》
涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。