码迷,mamicode.com
首页 > 其他好文 > 详细

告警系统邮件引擎 运行告警系统

时间:2018-07-22 23:33:20      阅读:290      评论:0      收藏:0      [点我收藏+]

标签:nta   xxx   crontab   ==   解释   sub   ext   链接   需要   

一、告警系统邮件引擎
技术分享图片
首先下载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(‘xxx@163.com‘,‘邮箱授权密码‘,‘xxx@163.com‘,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+邮件主题、邮件内容

告警系统邮件引擎 运行告警系统

标签:nta   xxx   crontab   ==   解释   sub   ext   链接   需要   

原文地址:http://blog.51cto.com/13669226/2148783

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!