20.23/20.24/20.25 告警系统邮件引擎
20.26 运行告警系统
20.23/22.24/22.25告警系统邮件引擎
邮件首先要有一个mail.py,因为之前做zabbix的时候,做过mail.py的脚本,在这里,直接调用进行使用就可以。但是告警邮件引擎核心,conf主配置文件调用到的都是mail.sh ,所以这里需要定义调用mail.py的sh脚本,mail.sh目的是做告警收敛,如果不想做告警收敛,在发现问题的时候直接告警就好,但是,可能会发生1分钟前发现问题,1分钟户问题解决,这样就会变成误报,这样会很麻烦,收敛的目的就是1分钟前发现问题,然后到10分钟后,服务还没有恢复,就会告诉管理人员10分钟了服务还未恢复。
先到sahres目录下来
[root@aming-01 ~]# cd /usr/local/sbin/mon/shares
[root@aming-01 shares]# pwd
/usr/local/sbin/mon/shares
[root@aming-01 shares]# ls
502.sh disk.sh load.sh
把之前的mail.py 拷贝到mon/mail 目录下
mail.sh内容 //其中mail.py内容到这里下载https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.py
[root@aming-01 shares]# cp /usr/lib/zabbix/
alertscripts/ externalscripts/
[root@aming-01 shares]# cp /usr/lib/zabbix/alertscripts/mail.py ../mail/mail.py
[root@aming-01 shares]# cd ..
[root@aming-01 mon]# ls
bin conf log mail shares
[root@aming-01 mon]# cd mail
[root@aming-01 mail]# ls
mail.py
[root@aming-01 mail]# vim mail.py
[root@aming-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
"mail.py" 40L, 1394C 1,1 顶端
需要知道的地方有三个,第一个,gserver = 'smtp.163.com' 发邮件的服务器的域名
第二个 , sendqqmail('aming_test2017@163.com','cc293016','aming_test2017@163.com' 这是我的163邮箱 和密码
这是mail.py,这还没有完,因为最核心的地方不是mail.py,而是 mail.sh,因为我们在所有的子脚本中,用到的都是mail.sh
[root@aming-01 mail]# vim mail.py
[root@aming-01 mail]# vim mail.sh
log=$1
t_s=date +%s
t_s2=date -d "2 hours ago" +%s
//定义2个小时的时间戳
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 ] // 当故障存在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
30,0-1 底端
该脚本运用于,间隔3600 故障;10分钟内故障;间歇性故障;核心判断:计时3600秒、计数10次
20.26 运行告警系统
要执行告警系统,肯定要是每分钟,执行一次,写到crontab里面去
crontab -e
-
-
-
-
- cd /usr/local/sbin/mon/bin ; bahs main.sh
监控发送邮件的部分,尽量少用空格,因为mail.py发送邮件是以 空格来定义三个参数的
[root@aming-01 mail]# pwd
/usr/local/sbin/mon/mail
- cd /usr/local/sbin/mon/bin ; bahs main.sh
-
-
-
[root@aming-01 mail]# crontab -e
no crontab for root - using an empty one
-
-
-
-
-
- cd /usr/local/sbin/mon/bin; bash main.sh
~
~
~
~
~
因为是实验所以没有必要真正写到crontab里面去,可以手动的执行下
[root@aming-01 mail]# cd /usr/local/sbin/mon/bin/
[root@aming-01 bin]# sh -x main.sh
- cd /usr/local/sbin/mon/bin; bash main.sh
-
-
-
-
- export send=1
- send=1
++ /sbin/ifconfig
++ grep -A1 'ens33: '
++ awk '/inet/ {print $2}' - export addr=192.168.202.130
- addr=192.168.202.130
++ pwd - dir=/usr/local/sbin/mon/bin
++ echo /usr/local/sbin/mon/bin
++ awk -F/ '{print $NF}' - last_dir=bin
- '[' bin == bin ']'
- conf_file=../conf/mon.conf
- exec
[root@aming-01 bin]#
很明显这个肯定是有错的,exec就是把接下来的执行过程搞到了日志里,可以看下日志
++ date '+%F %T' - echo '2017-11-27 21:11:31 load average'
- /bin/bash ../shares/load.sh
- grep -q to_mon_502=1 ../conf/mon.conf
++ awk -F = '{print $2}'
++ sed 's/ //g'
++ grep logfile= ../conf/mon.conf - export log=/data/log/xxx.xxx.com/access.log
- log=/data/log/xxx.xxx.com/access.log
- $'/bin/bash\302\240\302\240../shares/502.sh'
main.sh:行23: /bin/bash ../shares/502.sh: 没有那个文件或目录
[root@aming-01 bin]#
把502=1 改成 502=0 不需要监控,仅仅需要执行一个load
[root@aming-01 bin]# vim ../conf/mon.conf
to config the options if to monitor
定义mysql的服务器地址、端口以及user、password
to_mon_cdb=0 ##0 or 1, default 0,0 not monitor, 1 monitor
db_ip=10.20.3.13
db_port=3315
db_user=username
db_pass=passwd
httpd 如果是1则监控,为0不监控
to_mon_httpd=0
php 如果是1则监控,为0不监控
to_mon_php_socket=0
http_code_502 需要定义访问日志的路径
to_mon_502=0
logfile=/data/log/xxx.xxx.com/access.log
request_count 定义日志路径以及域名
to_mon_request_count=0
req_log=/data/log/www.discuz.net/access.log
domainname=www.discuz.net
~
~
~
~
~
~
~
~
:wq
一开始你在调试的时候,建议把这部分先注释掉 #exec 1>>../log/mon.log 2>>../log/err.log,因为我们先暂时不需要把日志写入到日志里面去
#exec 1>>../log/mon.log 2>>../log/err.log
echo "date +"%F %T"
load average"
/bin/bash ../shares/load.sh
#先检查配置文件中是否需要监控502
if grep -q 'to_mon_502=1' $conf_file; then
export log=grep 'logfile=' $conf_file |awk -F '=' '{print $2}' |sed 's/ //g'
/bin/bash ../shares/502.sh
fi
~
-- 插入 -- 17,2
:wq
[root@aming-01 bin]# vim main.sh
[root@aming-01 bin]#
再来执行下
[root@aming-01 bin]# sh -x main.sh
- export send=1
- send=1
++ grep -A1 'ens33: '
++ awk '/inet/ {print $2}'
++ /sbin/ifconfig - export addr=192.168.202.130
- addr=192.168.202.130
++ pwd - dir=/usr/local/sbin/mon/bin
++ awk -F/ '{print $NF}'
++ echo /usr/local/sbin/mon/bin - last_dir=bin
- '[' bin == bin ']'
- conf_file=../conf/mon.conf
++ date '+%F %T' - echo '2017-11-27 21:20:06 load average'
2017-11-27 21:20:06 load average - /bin/bash ../shares/load.sh
21:20:06 load is 0 - grep -q to_mon_502=1 ../conf/mon.conf
[root@aming-01 bin]#
说明执行过程没问题,当它调用load.sh也是没问题的
[root@aming-01 bin]# bash ../shares/load.sh
21:24:27 load is 0
[root@aming-01 bin]#
还有一种把文件的内容作为第三个参数
[root@aming-01 bin]# cd ..
[root@aming-01 mon]# cd mail/
[root@aming-01 mail]# ls
mail.py mail.sh
[root@aming-01 mail]# vi mail.sh
[root@aming-01 mail]# cd ..
[root@aming-01 mon]# cd shares/
[root@aming-01 shares]# ls
502.sh disk.sh load.sh
[root@aming-01 shares]# vim load.sh
#! /bin/bash
##Writen by aming##
load=uptime |awk -F 'average:' '{print $2}'|cut -d',' -f1|sed 's/ //g' |cut -d. -f1
if [ $load -gt 10 ] && [ $send -eq "1" ]
then
echo "$addr date +%T
load is $load" >../log/load.tmp
/bin/bash ../mail/mail.sh aming_test@163.com "$addr_load:$load" cat ../log/load.tmp
fi
echo "date +%T
load is $load"
~
~
~
10,0-1 全部
这就是我们的监控系统,至于发邮件,就不再演示了,自己去研究下,尤其是在告警收敛这款
转载于:https://blog.51cto.com/ch71smas/2045433