告警系統郵件引擎 運行告警系統

一、告警系統郵件引擎
告警系統郵件引擎  運行告警系統
首先下載mail.py這個腳本,腳本下載鏈接:
https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.py
[root@linux-01 shares]# cp /usr/lib/zabbix/alertscripts/mail.py ../mail/mail.py //拷貝之前的mail.py到mail目錄下
[root@linux-01 shares]# cd ..
[root@linux-01 mon]# cd mail/ //進入到mail目錄下
[root@linux-01 mail]# ls
mail.py
[root@linux-01 mail]# vim mail.py
#!/usr/bin/env python
#-- coding: UTF-8 --
import os,sys
reload(sys)
sys.setdefaultencoding('utf8')
import getopt
import smtplib
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart
from subprocess import *

def sendqqmail(username,password,mailfrom,mailto,subject,content):
gserver = 'smtp.163.com'
gport = 25

try:
    msg = MIMEText(unicode(content).encode('utf-8'))
    msg['from'] = mailfrom
    msg['to'] = mailto
    msg['Reply-To'] = mailfrom
    msg['Subject'] = subject

    smtp = smtplib.SMTP(gserver, gport)
    smtp.set_debuglevel(0)
    smtp.ehlo()
    smtp.login(username,password)

    smtp.sendmail(mailfrom, mailto, msg.as_string())
    smtp.close()
except Exception,err:
    print "Send mail failed. Error: %s" % err

def main():
to=sys.argv[1]
subject=sys.argv[2]
content=sys.argv[3]
##定義QQ郵箱的賬號和密碼,你需要修改成你自己的賬號和密碼(請不要把真實的用戶名和
密碼放到網上公開,否則你會死的很慘)
sendqqmail('[email protected]','郵箱授權密碼','[email protected]',to,subject,content)

if name == "main":
main()
//腳本解釋:
gserver = 'smtp.163.com'定義發郵件服務器的域名

最核心的不是mail.py,而是mail.sh腳本,因爲在所有的子腳本中使用到的都是mail.sh
mail.sh主要目的是做告警收斂的,如果服務器監控的機器比較多,郵件一分鐘告警次數就幾百封,收斂的目的是當服務出現問題,第一次檢查發一封告警,告訴你出現問題了,如果第二分鐘服務沒有,設置不告警,如果第十分鐘還是沒有恢復,再發一封告警郵件,就是這樣的一個目的,關鍵難點在於計數器怎麼搞,如果$v大於3600秒(1小時),直接mail.py $1 $2 $3;當服務異常的時候纔會調用mail.sh腳本
[root@linux-01 mail]# vim mail.sh
log=$1
t_s=date +%s
t_s2=date -d "2 hours ago" +%s
if [ ! -f /tmp/$log ]
then
echo $t_s2 > /tmp/$log
fi
t_s2=tail -1 /tmp/$log|awk '{print $1}'
echo $t_s>>/tmp/$log
v=$[$t_s-$t_s2]
echo $v
if [ $v -gt 3600 ]
then
./mail.py $1 $2 $3
echo "0" > /tmp/$log.txt
else
if [ ! -f /tmp/$log.txt ]
then
echo "0" > /tmp/$log.txt
fi
nu=cat /tmp/$log.txt
nu2=$[$nu+1]
echo $nu2>/tmp/$log.txt
if [ $nu2 -gt 10 ]
then
./mail.py $1 "trouble continue 10 min $2" "$3"
echo "0" > /tmp/$log.txt
fi
fi
//腳本解釋:
log=$1其中log作爲一個變量,$1是第一個參數,當你發郵件的時候,每次發郵件的時候都要找到一個跟監控項對應的一個日誌;
t_s=date +%s定義了一個時間戳;
t_s2=date -d "2 hours ago" +%s定義兩個小時以前的時間戳;
if [ ! -f /tmp/$log ]
then
echo $t_s2 > /tmp/$log
fi //如果日誌不存在,需要給它創建一個日誌,日誌內容第一行就是兩個小時以前的時間戳,
t_s2=tail -1 /tmp/$log|awk '{print $1}'截取數據裏面的最後一行(最後一行也就是時間戳)
echo $t_s>>/tmp/$log 把當前時間的時間戳寫入到日誌裏面;
v=$[$t_s-$t_s2] v又定義了一個變量,上一次的時間戳和這次的時間戳做對比;
echo $v 查看相差幾秒,如果每分鐘執行一次,那麼兩個時間戳相差就是60秒;
echo "0" > /tmp/$log.txt這裏又生成一個新的日誌,這個日誌的目的是用來計數的計數器,只要它告警了就記一個數,依次告警記一個數加一,在一個週期之內,比如定義的就是10分鐘;如果差值大於3600了,就會直接發郵件
如果差值小於3600,就會做另外一種判斷
else
if [ ! -f /tmp/$log.txt ]
then
echo "0" > /tmp/$log.txt //如果文件存在,重置,如果文件不存在,直接創建這個文件
fi
nu=cat /tmp/$log.txt定義新的變量nu,nu主要是查看計數器裏面的數字;
nu2=$[$nu+1] nu2表示在nu的基礎上加1;
echo $nu2>/tmp/$log.txt 加完1之後把計數器的數值寫入到/tmp/$log.txt 裏面去;
if [ $nu2 -gt 10 ] 如果計數器大於10
./mail.py $1 "trouble continue 10 min $2" "$3" 去郵件提示問題持續了10分鐘了;
echo "0" > /tmp/$log.txt 告完警之後重新開始計數 ;
思路:分幾種情況:
第一種:一臺新機器剛加上告警系統監控腳本mail.sh,這個腳本在機器上從來沒有執行過
第二種:問題持續了2分鐘,第三分鐘的時候問題恢復了,但是在第八分鐘問題又出現了
核心:1、計時 3600秒 2、計數 10次

二、運行告警系統
要執行告警系統,肯定是每分鐘執行一次
下面寫一個每分鐘執行一次的cron
[root@linux-01 mail]# pwd
/usr/local/sbin/mon/mail
[root@linux-01 mail]# crontab -e //加入任務計劃

          • cd /usr/local/sbin/mon/bin; bash main.sh
            腳本內容中,配置發郵件那部分少帶空格,因爲它是使用空格來作爲分隔符的,三個參數分別是:收件人郵箱、IP+郵件主題、郵件內容
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章