zabbix邮件告警

Posted by Yancy on 2014-10-05

操作系统环境:

CentOS release 6.7 (Final)

zabbix版本2.4.7

关于操作系统CentOS6.0 以下版本都是通过mail命令调用sendmail的sm-client发送邮件,所以如果关闭sendmail按照很多网上的文档是发不出邮件的。

centos 6.0以上版本

1
2
默认已经安装好sendmail
默认已经安装好postfix

sendmail和postfix只需要安装一个即可并开启服务即可。

实现目的:

在Zabbix服务端设置邮件报警,当被监控主机宕机或者达到触发器预设值时,会自动发送报警邮件到指定邮箱,定位哪里出现问题,可以及时的解决。

1.安装邮件发送工具mailx

CentOS 6.x 编译安装mailx,直接yum安装的mailx版本太旧,使用外部邮件发送会有问题。

1
2
3
yum install mailx #安装
yum remove mailx #卸载系统自带的旧版mailx

这里我用编译安装的很简单几步就可以了。

mail下载地址:Downloads

1
2
3
4
5
6
7
8
9
10
11
[root@salt ~]# curl -O http://ftp.debian.org/debian/pool/main/h/heirloom-mailx/heirloom-mailx_12.5.orig.tar.gz
[root@salt ~]# tar -zxvf heirloom-mailx_12.5.orig.tar.gz
[root@salt ~]# cd heirloom-mailx-12.5
[root@salt heirloom-mailx-12.5]# make
[root@salt heirloom-mailx-12.5]# make install UCBINSTALL=/usr/bin/install
[root@salt heirloom-mailx-12.5]# ln -s /usr/local/bin/mailx /bin/mail #创建mailx到mail的软连接
[root@salt heirloom-mailx-12.5]# ln -s /etc/nail.rc /etc/mail.rc #创建mailx配置文件软连接
[root@salt heirloom-mailx-12.5]# whereis mailx #查看安装路径
mailx: /bin/mailx /usr/local/bin/mailx /usr/share/man/man1p/mailx.1p.gz /usr/share/man/man1/mailx.1.gz
[root@salt heirloom-mailx-12.5]# mailx -V #查看版本信息
12.5 6/20/10

安装完以后我们来测试下:

1
2
3
4
5
6
[root@salt]# echo "zabbix test mail" |mail -s zabbix" it@hz-health.cn
[root@salt]# send-mail: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
send-mail: warning: inet_protocols: configuring for IPv4 support only
postdrop: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
postdrop: warning: inet_protocols: configuring for IPv4 support only
postdrop: warning: unable to look up public/pickup: No such file or directory

如果有出现这个报错,那么我们需要修改下配置文件。
查看当前inet_protocols

1
2
3
4
5
6
7
8
9
# /usr/sbin/postconf | grep inet_protocols
inet_protocols = all
修改ipv4
# vi /etc/postfix/main.cf
inet_protocols = all
改为
inet_protocols = ipv4
重启postfix
service postfix restart

然后在测试:

1
[root@salt]# echo "zabbix test mail" |mail -s "zabbix" it@xxxx.cn

测试发送邮件,标题zabbix,邮件内容:zabbix test mail,发送到的邮箱:xxx.qq.com

这时候,邮箱yyy@qq.com会收到来自xxx@qq.com的测试邮件。

2、创建邮件告警的python脚本

zabbix_server添加脚本配置:

  1. zabbix安装路径:cd /usr/local/zabbix/share/zabbix/alertscripts

编写脚本:
vim /usr/local/zabbix/share/zabbix/alertscripts/zabbix_sendmail.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/env python
#coding:utf-8
import smtplib
from email.mime.text import MIMEText
import sys
LOG_FILENAME="/var/log/email_python.log"
mail_host = 'smtp.exmail.qq.com' #定义smtp服务器
mail_user = 'it@xxxx.cn' #发件人邮箱
mail_pass = 'xxxxxxx' #发件人邮箱密码
mail_port = 465 #smtp服务器的端口号,不同的邮箱服务器端口号不同
def send_mail(to_list,subject,content):
me="Zabbix Monitor"+"<"+mail_user+">" #定义发件人显示名称为Zabbix Monitor
msg=MIMEText(content,_subtype='plain',_charset='gb2312')
msg['Subject']=subject #定义邮件主题
msg['From']=me #发送方
msg['to']=to_list #接收方
try:
s=smtplib.SMTP_SSL() #创建一个smtp对象
s.connect(mail_host,mail_port) #通过connect方法连接smtp主机
s.login(mail_user,mail_pass) #邮箱账户登录认证
s.sendmail(me,to_list,msg.as_string()) #发送邮件
s.close() #断开smtp连接
return True
except Exception,e:
print str(e)
return False
if __name__ == "__main__":
send_mail(sys.argv[1],sys.argv[2],sys.argv[3])

2、脚本文件路径

先确认下zabbix_server.conf文件中定义的告警脚本路径配置:

如果注释了,添加一条绝对路径。

1
2
# AlertScriptsPath=${datadir}/zabbix/alertscripts
AlertScriptsPath=/usr/local/zabbix/share/zabbix/alertscripts

然后将准备好的python脚本存放到该路径下,并更改脚本文件的权限和属主属组

1
2
chown zabbix.zabbix /usr/local/zabbix/share/zabbix/alertscripts/zabbix_sendmail.py
chmod +x /usr/local/zabbix/share/zabbix/alertscripts/zabbix_sendmail.py

注意:如果在zabbix_server.conf文件中没有设置Allow root=1,则表示zabbix是以zabbix用户启动而不是root,所以脚本的属主属组都应该设置为zabbix用户。设置为root用户启动的配置如下。

1
2
3
4
5
6
7
8
9
### Option: AllowRoot
# Allow the server to run as 'root'. If disabled and the server is started by 'root', the server
# will try to switch to user 'zabbix' instead. Has no effect if started under a regular user.
# 0 - do not allow
# 1 - allow
#
# Mandatory: no
# Default:
AllowRoot=1

重启服务:

1
2
3
[root@salt alertscripts]# /etc/init.d/zabbix_server restart
Shutting down zabbix_server: [确定]
Starting zabbix_server: [确定]

3、测试脚本文件发送邮件是否成功,这一步很重要

1
./zabbix_sendmail.py cheng@health.cn "subject" "zabbix"

已经测试ok,可以收到邮件,说明写的python脚本没有问题。

zabbix-web端设置

  • 首先web端的配置顺序如下:
    创建用户媒介–>创建用户组和用户–>针对trigger(触发器)添加报警动作,设置邮件发送用户及媒介

1.创建用户媒介

  • 创建用户媒介–>创建用户组和用户–>Media types–>Createmediatype

    • Mediatype设置如下, Name项自定义(创建用户时会用到这个名字),我们使用脚本来发邮件,所以Type项请选择Script,Script项则是你zabbix server上的发送邮件的脚本名字
    • (注:如脚本名字是snedmail.py,那此项就填sendmail,后缀不要)

    • zabbix会传给脚本三个参数:接收用户,邮件主题,邮件内容

2.设置Zabbix用户报警邮箱地址

  • 组态-用户-Admin (Zabbix Administrator)
    • 再到Media标签下,点击Add添加用户及该用户的报警方式,然后Type项选择你所创建的邮件报警名字(Media Type),在Send to后填入用户的报警邮箱,其他默认即可。

3.设置Zabbix触发报警的动作

  • 组态-动作-创建动作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
名称:Action-Email
默认接收人:故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!
默认信息:
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
恢复信息:打钩
恢复主旨:恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!
恢复信息:
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
已启用:打钩

创建Operations

到这里就基本配置完毕了。

测试下关闭agent 1分钟左右可以收到邮件。 关闭防火墙和selinux 即可,不关闭防火墙开启10051端口和10050端口

测试

查看zabbix审计动态日志:
发送成功

邮件已接收成功。

微信告警也已写详细文档。文档file已上传github上面了。

zabbix-server2.4服务端编译安装 zabbix-server服务端编译安装

zabbix2.4监控80端口状态 : zabbix监控80端口状态

zabbix+Grafana安装使用监控结合 :zabbix+Grafana安装使用监控结合

zabbix监控MySQL-添加自定义监控项 : zabbix监控MySQL-添加自定义监控项

zabbix的ICMP_Ping模版实现对客户端网络状态的监控 : zabbix的ICMP_Ping模版实现对客户端网络状态的监控

zabbix性能监控故障总结 zabbix性能监控故障总结