20.23/20.24/20.25 告警系統郵件引擎python
20.26 運行告警系統linux
20.23/20.24/20.25 告警系統郵件引擎git
郵件首先要有一個mail.py,如下。vim
由於咱們以前zabbix的時候作過,就能夠直接拷貝過來bash
mail.sh內容 //其中mail.py內容到這裏下載https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.py服務器
!mail.sh的做用是報警收斂!.net
!mail.py的做用是發送郵件!debug
log=$1日誌
t_s=`date +%s`code
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
實例:
[root@axinlinux-01 ~]# cp /usr/lib/zabbix/alertscripts/mail.py /usr/local/sbin/mon/mail/
[root@axinlinux-01 ~]# cd !$
cd /usr/local/sbin/mon/mail/
[root@axinlinux-01 mail]# ls
mail.py
[root@axinlinux-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' #1.咱們須要關注這個,發郵箱的服務器的域名。若是是qq的就是smtp.qq.com(qq好的好像不太好用?)
gport = 25
try:
# msg = MIMEText(unicode(content).encode('utf-8')) //若是發送的郵件有亂碼,能夠嘗試把這行改爲以下:
msg = MIMEText(content,'plan','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('郵箱名','郵箱密碼','郵箱名',to,subject,content) #163郵箱名,密碼
if __name__ == "__main__":
main()
#####腳本使用說明######
#1. 首先定義好腳本中的郵箱帳號和密碼
#2. 腳本執行命令爲:python mail.py 目標郵箱 "郵件主題" "郵件內容"
以上,搞定mail.py。而後咱們還須要mail.sh,複製上面的內容。作mail.sh的目的是告警收斂,由於在子腳本中定義了一分鐘告警一次,總不能一分鐘發一次把。也就是從第一次的告警開始,作一個時間標記,若是這一分鐘沒有回覆,那下一分鐘不告警。等到好比第十分鐘尚未回覆,這個時候在告警一次,提醒十分鐘了尚未回覆。就是這麼個目的,也就是報警收斂
log=$1 #$1做爲咱們的第一個參數。當你發郵件的時候,好比咱們在disk子腳本中定義的發郵件的時候,每次都要找到一個跟監控項目對應的日誌,/bin/bash ../mail/mail.sh $addr\_disk $r ../log/disk.tmp這個是咱們定義disk的時候。監控disk的時候就是這樣寫,ip地址下劃線後面跟log($addr\_disk $r ../log/disk.tmp)。其餘的子腳本也都同樣,名字都是在子腳本里自定義的(像什麼load、disk、502等等)
t_s=`date +%s` #定義了一個時間戳
t_s2=`date -d "2 hours ago" +%s` #定義了兩個小時之前的時間戳
if [ ! -f /tmp/$log ] #若是$1log這個日誌不存在(就是咱們ip地址下劃線後面跟log的這個日誌)
then #就建立這個日誌。也就是下面的,不存在的話就生成一個日誌,記錄兩個小時之前的時間戳)
echo $t_s2 > /tmp/$log
fi
t_s2=`tail -1 /tmp/$log|awk '{print $1}'` #把t_s2這個變量賦值
echo $t_s>>/tmp/$log #把當前時間的時間戳寫入到這個日誌裏去
v=$[$t_s-$t_s2] #這個$v是跟上面那個時間戳的比值差。桑一次的時間戳跟這一次的時間戳作一個對比,看看他們的時間差是多少(時間戳以秒爲單位),相差幾秒。也就是一個計時器
echo $v
if [ $v -gt 3600 ] #好比$V大於一個小時了
then
./mail.py $1 $2 $3 #直接調用mail.py告警(也就是發郵件)。三個參數 發送給誰 主題 內容
echo "0" > /tmp/$log.txt #而且生成一個新的日誌,也就是計數器吧。一次告警記一個數。在咱們定義的3600這個使勁週期以內,告警一次相加一次)。
而且進入清0,進入下一個週期。也就是沒必要判斷這個文件存在仍是不存在
else
if [ ! -f /tmp/$log.txt ] #若是計數器的文件不存在
then
echo "0" > /tmp/$log.txt #不存在清0(建立)
fi
nu=`cat /tmp/$log.txt` #nu。查看計數器裏面的數字
nu2=$[$nu+1] #nu2。在nu的基礎上加1
echo $nu2>/tmp/$log.txt #把加1的數值寫入到這個日誌裏去。寫入的目的是,每次都能查看這個計數器。若是用這個變量的話,下次就不能查看了
if [ $nu2 -gt 10 ] #當大於10的時候(也就是大於10分鐘的時候,由於一分鐘一次)。
then
./mail.py $1 "trouble continue 10 min $2" "$3" #大於10的時候,在報一警。不到10就計數。這樣就達到了報警收斂的做用(也就是大於10報警,不大於10計數)
echo "0" > /tmp/$log.txt #告完警,再從新計數(清0)
fi
fi
總結mail.sh:
場景一,mail.sh一次都沒有執行過的時候。(好比新的機器,剛加入這個監控腳本)第一次發生異常告警。就從一開始的log=$1開始。$1就是表明的子腳本中定義的(好比,disk子腳本里定義的$addr\_disk $r)。而後就是兩個時間戳(當前的與2個小時之前的),目的是下面有定義3600,讓3600這個條件成立,成立後就直接報警啦)。由於第一次執行這個腳本發生異常,必需要報警
場景二,第一次報完警開始計數(10分鐘)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20.26 運行告警系統:
咱們在要給主腳本作一個任務計劃。由於,腳本是每分鐘運行一次的
[root@axinlinux-01 mail]# crontab -e
* * * * * cd /usr/local/sbin/mon/bin; bash main.sh
咱們必需要進入到這個bin目錄下,而後再執行這個main.sh腳本