第六章: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}
View Code

邮件告警脚本配置

 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 :
 {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"
View Code

 如何取消告警发送

1 如何取消告警发送
2 当大量告警无法正常发送时,告警会处于队列堆积状态,因此,我们可以手动关闭告警,使其不再发送。在数据库中,alerts表记录了即将发送的告警消息,其状态为1,表示待发送;状态为0,表示已发送,因此可以使用如下语句批量取消告警发送。
3 shell# mysql -uzabbix -pzabbix zabbix "update alerts set status='1' where status='0'"
View Code

如何删除故障信息

 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[新增加的内容]
View Code
原文地址:https://www.cnblogs.com/weidongliu/p/13594341.html