20.23/24/25 告警系统邮件引擎
邮件告警脚本。
#!/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-mail.outlook.com'
gport = 587
try:
# msg = MIMEText(unicode(content).encode('utf-8')) //如果发送的邮件有乱码,可以尝试把这行改成如下:
msg = MIMEText(content,'plain','utf-8')
msg['from'] = mailfrom
msg['to'] = mailto
msg['Reply-To'] = mailfrom
msg['Subject'] = subject
smtp = smtplib.SMTP(gserver, gport)
smtp.starttls()
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]
sendqqmail('[email protected]','z1x2c7v2b7','[email protected]',to,subject,content)
if __name__ == "__main__":
main()
发邮件的server和port需要按照自己的邮件配置。
mail.py只是一个发信的工具,最核心的部分是mail.sh。
因为所有的子脚本中用到的都是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
这里面主要是做告警收敛。难点在于这个计时器是借助外部文件来做计数的。
视频中详细介绍了这个脚本的各中场景下的输出,不懂的时候回去看视频。
20.26 运行告警系统
root@lhy-server:/usr/local/sbin/mon/bin# crontab -e
* * * * * cd /usr/local/sbin/mon/bin; bash main.sh
这里我们为了测试可以手动运行
root@lhy-server:/usr/local/sbin/mon# cd /usr/local/sbin/mon/bin/
root@lhy-server:/usr/local/sbin/mon/bin# ls
main.sh
root@lhy-server:/usr/local/sbin/mon/bin# bash -x main.sh
+ export send=1
+ send=1
++ /sbin/ifconfig
++ grep -A1 'enp2s0 '
++ tail -1
++ awk '{print $2}'
++ awk -F: '{print $2}'
+ export addr=192.168.0.109
+ addr=192.168.0.109
++ pwd
+ dir=/usr/local/sbin/mon/bin
++ echo /usr/local/sbin/mon/bin
++ awk -F/ '{print $NF}'
++ sed 's/\/*$//'
+ last_dir=bin
+ '[' bin == bin ']'
+ conf_file=../conf/mon.conf
+ exec
日志也好像没有问题
root@lhy-server:/usr/local/sbin/mon/bin# cat ../log/
err.log mon.log
root@lhy-server:/usr/local/sbin/mon/bin# cat ../log/mon.log
2018-09-21 22:50:01 load average
22:50:01 load is 0
2018-09-21 22:51:01 load average
22:51:01 load is 0
2018-09-21 22:52:01 load average
22:52:01 load is 0
2018-09-21 22:53:01 load average
22:53:01 load is 0
2018-09-21 22:53:18 load average
22:53:18 load is 0
2018-09-21 22:59:07 load average
22:59:07 load is 0
2018-09-21 23:03:49 load average
23:03:49 load is 0
2018-09-21 23:17:17 load average
23:17:17 load is 0
2018-09-21 23:17:31 load average
23:17:31 load is 0
脚本出现问题很正常,因为我们缺少很多服务,比如502我们暂时还监控不了。
这个还需要自己摸索。