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脚本