第六章:zabbix告警配置并实现告警通知
我们首先对Trigger配置页面进行详细的讲解
参数 | 说明 | ||
Name | Trigger的名称,可以支持宏{HOST.HOST}、{HOST.NAME} | ||
Severity | 触发器的事件级别 | ||
Not classified | 未知安装等级 | 灰色 | |
Information | 一般信息 | 亮绿 | |
Warning | 警告信息 | 黄色 | |
Average | 一般故障 | 橙色 | |
High | 高级别故障 | 红色 | |
Disaster | 致命故障 | 亮红 | |
Expression | 定义故障、问题的逻辑表达式 | ||
OK event generation | Expression | ok事件与Expression表达式相同,不符合Expression的预期即为OK | |
Recovery expression | 当符合Recovery expression表达式的预期,才会将事件变为ok | ||
None | 让触发器不在返回到ok状态 | ||
PROBLEM event generation mode | Single | 当触发器第一次进入PROBLEM状态时会生成一个事件,对于其后采集到的数据不会再重复告警 | |
Multiple | 当触发器第一次进入PROBLEM状态时会生成一个事件,对于其后采集到的数据每次都会触发告警 | ||
ok event closes | OK事件是否关闭 | ||
All problem | 该触发器产生的所有故障、问题 | ||
All problem if tag values match | 故障、问题标签匹配的值 | ||
Allow manual close | 允许手动关闭故障/问题事件 | ||
URL | |||
Description | 对触发器的描述,用于提供有关此触发器更多信息的文本字段。可能包含修复特定问题的说明、负责人员的联系方式等。 | ||
Enabled |
触发器的开关,如果需要,可以取消选中此复选框来禁用触发器 |
Trigger告警依赖
Trigger表达式示例;
示例1:对主机www.zabbix.com的CPU负载值进行判断。last()取最近一次获取到的值
{www.zabbix.com:system.cpu.load[all,avg1].last(0)}>5
示例2:对主机www.zabbix.com的CPU负载值进行多重条件判断。当负载值大于5或者最近10分钟内负载最小值大于2,将会触发告警。
{www.zabbix.com:system.cpu.load[all,avg1].last()}>5 or {www.zabbix.com:system.cpu.load[all,avg1].min(10m)}>2
示例3:对文件/etc/paaswd是否有变化进行监控。使用diff()函数
{www.zabbix.com:vfs.file.cksum[/etc/passwod].diff()}=1
示例4:对网卡流量是否超过一定的阈值进行条件判断。
{www.zabbix.com:net.if.in[eth0,bytes].min(5m)}>100K
示例5:两台SMTP服务器的集群节点都停止了,注意,在一个表达式中使用两个不同的主机,语句如下:与刚刚上边讲的告警关联有异曲同工之妙。
{smtp1.zabbix.com:net.tcp.service[smtp].last()}=0 and {smtp2.zabbix.com:net.tcp.service[smtp].last()}=0
示例6:对zabbix客户端代理版本是否满足特定版本进行判断。使用函数str(),当zabbix代理有版本beta8,即触发告警
{zabbix.zabbix.com:agent.version.str("beta8")}=1
示例7:服务器的icmp ping 不可达进度判断,在最近30分钟内超过5次不可达,该表达式为真。
{zabbix.com:icmpping.cout(30m,0)}>5
示例8:服务器最近3分钟内没有响应,使用nodata()函数
{zabbix.com:tick.nodata(3m)}=1
示例9:对CPU在特定时间的负载进行判断,使用time()函数,触发器只在晚上(00:00-06:00)可用,当5分钟内的负载大于2时,及告警。
{zabbix:system.cpu.load[all,avg1].min(5m)}>2 and {zabbix:system.cpu.load[all,avg1].time()} > 000000 and {zabbix:system.cpu.load[all,avg1].time()} < 060000
示例10:检查客户端本地时间是否与zabbix-server服务器时间同步.使用fuzzytime()函数,当数据库本地时间与zabbix server的时间相差10s时触发告警。
{Mysql_DB:system.localtime.fuzzytime(10)}=0
示例11:CPU的负载在最近1小时的平均值,与前一天的值进行同比大于2倍。
{server:system.cpu.load.avg(1h)} / {server:system.cpu.load.avg(1h,1d)}>2
示例12:存储容量小于总容量的10%
{Template PfSense:hrStorageFree[{#SNMPVALUE}].last()}<{Template PfSense: hrStorageSize[{#SNMPVALUE}].last()}*0.1 #乘号的优先级比小于号大
示例13:进程数是总进程数的80%
({Template_Oracle:oracle[procnum].last(0)}*100/{Template_Oracle:oracle[maxprocs].last(0)})>80
示例14:判断告警故障表达式,满足阈值的个数大于或等于2,即告警
({Zabbix server:system.cpu.load[percpu,avg1].last()}>5) + ({Zabbix server: system.cpu.load[percpu,avg1].last()}>5) + ({Zabbix server:system.cpu.load [percpu,avg1].last()}>5)>=2
微信告警
1 shell# wget https://github.com/zabbix-book/wechat-alert/archive/master.zip 2 shell# unzip master.zip 3 shell# cp wechat-alert-master/wechat_linux_amd64/etc/zabbix/alertscripts/ wehchat 4 shell# chmod 755 /etc/zabbix/alertscripts/wehchat 5 shell# chown zabbix:zabix /etc/zabbix/alertscripts/wehchat 6 脚本已经正确配置,现在我们调用程序发送微信消息。 7 8 shell# /etc/zabbix/alertscripts/wechat --corpid=wxee***********81aa --corpsecret= Mm0mHwI8iVsjA*JUGySxOFMIlbosoVEkWIEiw --msg="您好</br>告警测试" --user=oneoaas --agentid=1000003 9 接下来,我们在Zabbix-Web中配置微信告警,如图6-37所示,所配置的参数如下: 10 11 --corpid=wxee***********81aa 12 --corpsecret=Mm0mHwI8iVsjA*JUGySxOFMIlbosoVEkWIEiw 13 --agentid=1000003 14 --user={ALERT.SENDTO} 15 --msg={ALERT.MESSAGE}
邮件告警脚本配置
1 修改/etc/zabbix/zabbix_server.conf配置文件,语句如下: 2 3 shell# vim/etc/zabbix/zabbix server.conf 4 AlertScriptsPath=/etc/zabbix/alertscripts/ 5 shell#mkdir -p /etc/zabbix/alertscripts/ 6 shell#cat /etc/zabbix/alertscripts/zabbix_sendmail.py 7 #!/usr/bin/python 8 #coding:utf-8 9 10 import smtplib 11 from email.mime.text import MIMEText 12 import os 13 import argparse 14 import logging 15 import datetime 16 17 mail_host = 'smtp.163.com' 18 mail_user = 'monitor_itnihao' 19 mail_pass = 'my_password' 20 mail_postfix = '163.com' 21 22 def send_mail(mail_to,subject,content): 23 me = mail_user+"<"+mail_user+"@"+mail_postfix+">" 24 msg = MIMEText(content) 25 msg['Subject'] = subject 26 msg['From'] = me 27 msg['to'] = mail_to 28 global sendstatus 29 global senderr 30 31 try: 32 smtp = smtplib.SMTP() 33 smtp.connect(mail_host) 34 smtp.login(mail_user,mail_pass) 35 smtp.sendmail(me,mail_to,msg.as_string()) 36 smtp.close() 37 print 'send ok' 38 sendstatus = True 39 except Exception,e: 40 senderr=str(e) 41 print senderr 42 sendstatus = False 43 44 def logwrite(sendstatus,mail_to,content): 45 logpath='/var/log/zabbix/alert' 46 47 if not sendstatus: 48 content = senderr 49 50 if not os.path.isdir(logpath): 51 os.makedirs(logpath) 52 53 t=datetime.datetime.now() 54 daytime=t.strftime('%Y-%m-%d') 55 daylogfile=logpath+'/'+str(daytime)+'.log' 56 logging.basicConfig(filename=daylogfile,level=logging.DEBUG) 57 logging.info('*'*130) 58 logging.debug(str(t)+' mail send to {0},content is :\n {1}'.format (mail_to,content)) 59 60 if __name__ == "__main__": 61 parser = argparse.ArgumentParser(description='Send mail to user for zabbix alerting') 62 parser.add_argument('mail_to',action="store", help='The address of the E-mail that send to user ') 63 parser.add_argument('subject',action="store", help='The subject of the E-mail') 64 parser.add_argument('content',action="store", help='The content of the E-mail') 65 args = parser.parse_args() 66 mail_to=args.mail_to 67 subject=args.subject 68 content=args.content 69 70 send_mail(mail_to,subject,content) 71 logwrite(sendstatus,mail_to,content) 72 注意上面这个脚本文件需要Zabbix用户具有执行权限,以确保脚本能正常运行。下面对脚本文件进行权限改变。 73 74 shell# chmod 700 /etc/zabbix/alertscripts/zabbix_sendmail.py 75 shell# chown zabbix.zabbix /etc/zabbix/alertscripts/zabbix_sendmail.py 76 使用脚本测试发送邮件。 77 78 shell# python /etc/zabbix/alertscripts/zabbix_sendmail.py 79 info@itnihao.com test "test to send mail"
如何取消告警发送
1 如何取消告警发送 2 当大量告警无法正常发送时,告警会处于队列堆积状态,因此,我们可以手动关闭告警,使其不再发送。在数据库中,alerts表记录了即将发送的告警消息,其状态为1,表示待发送;状态为0,表示已发送,因此可以使用如下语句批量取消告警发送。 3 shell# mysql -uzabbix -pzabbix zabbix "update alerts set status='1' where status='0'"
如何删除故障信息
1 何删除故障信息 2 当Zabbix-Web界面中的故障信息,无法通过手动操作关闭故障的时候,我们还可以通过直接操作数据库进行删除。为了方便,可用笔者编写的脚本进行操作,如下所示: 3 #!/bin/bash 4 5 MYSQL_BIN=mysql #MySQL的程序 6 MYSQL_USER=zabbix #MySQL的用户名 7 MYSQL_PWD=zabbix #MySQL的密码 8 MYSQL_PORT=3306 #MySQL的端口 9 MYSQL_HOST=127.0.0.1 #MySQL的IP 10 DB_NAME=zabbix #数据库名称 11 MYSQL_LOGIN="${MYSQL_BIN} -u${MYSQL_USER} -p${MYSQL_PWD} -h${MYSQL_HOST} -P${MYSQL_PORT} ${DB_NAME}" 12 triggerids="13614 13684" #此处填写需要被删除的故障的triggerid 13 for ID in ${triggerids};do 14 echo "------------------------------------------------------" 15 echo "update zabbix.triggers set value=0 where triggerid=${ID} and value=1" 16 ${MYSQL_LOGIN} -e "update zabbix.triggers set value=0 where triggerid=${ID} and value=1" 2>&1 | grep -v "Warning: Using a password" 17 echo "delete from zabbix.events where objectid=${ID} and object=0" 18 ${MYSQL_LOGIN} -e "delete from zabbix.events where objectid=${ID} and object=0" 2>&1 | grep -v "Warning: Using a password" 19 #4.0版本还需要清理problem表的数据记录 20 ${MYSQL_LOGIN} -e "delete from zabbix.problem where objectid=${ID} and object=0" 2>&1 | grep -v "Warning: Using a password" 21 echo "" 22 done[新增加的内容]