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

1、告警系統郵件引擎
告警系統郵件引擎  運行告警系統
首先下載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 *python

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

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('xxx@163.com','郵箱受權密碼','xxx@163.com',to,subject,content)git

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

最核心的不是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分鐘,第三分鐘的時候問題恢復了,可是在第八分鐘問題又出現了
核心:一、計時 3600秒 二、計數 10次bash

2、運行告警系統
要執行告警系統,確定是每分鐘執行一次
下面寫一個每分鐘執行一次的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+郵件主題、郵件內容
相關文章
相關標籤/搜索