简介
在zabbix的使用中,最重要的一点就是完善的报警机制,作为监控平台,需要时刻关注机器和服务的运行状态,更重要的是发现故障之后需要及时的报警给相关人员,早点发现问题,将隐患消除在未然阶段。这样才能保证服务的稳定运行。
报警的方式是多种多样的,微信、短信和邮件报警是我们比较常见的方式。而且报警的频率和策略直接影响着运维人员的重视程度和检错效率。如果整个报警列表中都是一些无关痛痒的提示、轻度警告。而他们的发送频率又特别的高,则非常容易错过真正关键的报警。
本文主要介绍使用sendemail实现外部邮箱报警功能,短信、微信报警在此处不做讨论。
报警邮箱准备
邮件报警有两种情况:
- Zabbix服务端只是单纯的发送报警邮件到指定邮箱,发送报警邮件的这个邮箱账号是Zabbix服务端的本地邮箱账号(例如:root@localhost.localdomain),只能发送,不能接收外部邮件。但使用本地邮箱发送邮件经常会被认为是垃圾邮件,从而被拦截归入垃圾箱。故此推荐使用外部邮箱充当发件人。
- 使用一个可以在互联网上正常收发邮件的邮箱账号(例如:xxx@163.com),通过在Zabbix服务端中设置,使其能够发送报警邮件到指定邮箱。
如采用外部邮箱发送邮件,外部邮箱需支持smtp/pop3功能才可正常供zabbix端调用。本例采用网易邮箱充当外部邮箱发送报警信息。需做以下设置:
至此,外部邮箱设置完毕。
Zabbix配置更改
修改zabbix_server.con
在410行的地方: AlertScriptsPath=/usr/lib/zabbix/alertscripts (脚本存放目录路径,视实际情况选择路径,注意权限)
写入脚本
这里有2个脚本:
第一个是zabbix调用的发送邮件的脚本. 他会调用第二个脚本去发送邮件。(Media types的script name)
第一个脚本:
[root@zabbix ~]# cat /usr/lib/zabbix/alertscripts/sendemail.sh
#!/bin/bash
SMTP_server='smtp.xxx.com' # SMTP服务器
username='************' # 用户名
password='***********' # 密码
from_email_address='**********' # 发件人Email地址
to_email_address="$1" # 收件人Email地址,zabbix传入的第一个参数
message_subject_utf8="$2" # 邮件标题,zabbix传入的第二个参数
message_body_utf8="$3" # 邮件内容,zabbix传入的第三个参数
# 转换邮件标题为GB2312,解决邮件标题含有中文,收到邮件显示乱码的问题。
message_subject_gb2312=`iconv -t GB2312 -f UTF-8 << EOF
$message_subject_utf8
EOF`
[ $? -eq 0 ] && message_subject="$message_subject_gb2312" || message_subject="$message_subject_utf8"
# 转换邮件内容为GB2312
message_body_gb2312=`iconv -t GB2312 -f UTF-8 << EOF
$message_body_utf8
EOF`
[ $? -eq 0 ] && message_body="$message_body_gb2312" || message_body="$message_body_utf8"
# 发送邮件
sendEmail='/usr/bin/sendEmail'
$sendEmail -s "$SMTP_server" -xu "$username" -xp "$password" -f "$from_email_address" -t "$to_email_address" -u "$message_subject" -m "$message_body" -o message-content-type=text -o message-charset=gb2312
echo "`date +"%F %T"` send to $to_email_address" >> /tmp/send.log
这个脚本解释的很详细我就不解释了
这里的用户名和密码是发件人的,通过SMTP发送邮件。可以使用QQ,163任何一个提供了SMTP的邮箱公司邮箱也可以。要修改的就是smtp,用户名,密码,发件人的邮箱。smtp可以去邮箱提供商获取,或者百度
脚本加权限
chmod +x sendemail.sh
第二个脚本是perl 写的sendemail,专门用来通过smtp发送邮件的
第二个脚本:http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz
(不是sendmail,这个是perl 写的一个使用smtp发送邮件的脚本)
wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz
tar xvf sendEmail-v1.56.tar.gz
cd sendEmail-v1.56
cp sendEmail /usr/bin/
chmod +x /usr/bin/sendEmail
解压: tar xvf sendEmail-v1.56.tar.gz
将里边的sendEmail 复制到/usr/bin/
然后测试第一个脚本
/usr/lib/zabbix/alertscripts/sendemail.sh xxxxxx@qq.com zabbixtest " this is zabbix test mail ! "
如果能收到说明这两个脚本都没问题
Zabbix网页端
此处使用sendemail脚本配置发送报警邮件。sendemail是用perl语言写的一个smtp发邮件的小程序,详情可自行查阅
- 媒介类型
管理---->报警媒介类型-----创建媒体类型
名称:sendemail
类型:脚本
脚本名称:sendemail.sh
脚本参数:
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
- 用户报警媒介
用户配置下的报警媒介.
管理--->用户--->选择用户--->报警媒介 添加类型、邮件地址(接收的邮件地址)
- 当触发tiggers时发生的动作...这就是发送邮件的入口
配置--> 动作 -->创建动作
名称:Send to Admin
默认接收人:【故障】服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障
默认信息:
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}
事件ID:{EVENT.ID}
恢复信息: 这个是当报警回复正常发送邮件的内容. 这些变量都是系统定义好.你可以引用 也可以自己定义变量.
恢复主题:【恢复】 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!
恢复信息:
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:
事件ID:{EVENT.ID}
- 设置触发器条件
- 定义触发条件后进行的动作
这样基本就完成了。
查看日志
报警设置完成后,可以在报表-à动作日志 查看相关动作,成功与否都会有日志记录,如发送失败可根据错误提示查看错误提示。根据错误提示排错。