触发器邮件警告
Zabbix 默认的邮箱警告有个 SMTP HELO 的值,我一直不知道怎么填写,反正这个值一直报错,网上爬文一堆都是通过脚本来发邮件的。
部署 sendEmail 环境
参考文献1:Zabbix通过stmp邮件报警
参考文献2:zabbix 3.0.2邮件报警
这里需要用到 sendEmail 下载地址,它是基于 perl 写的一个脚本,如果用 SSL 加密的话需要依赖 perl 的 Net::SSLeay 和 IO::Socket::SSL 模块,debian 和 Ubuntu 的源都可以直接安装这个软件,另外安装 libcrypt-ssleay-perl libio-socket-ssl-perl ca-certificates
这三个包即可。
但是我查了下,zabbix/zabbix-server-mysql:latest 是使用 alpine 的,我测试的时候 sendEmail 官网下载的脚本会遇到 invalid SSL_version
的报错。Google 一番后据说要修改 /usr/share/perl5/IO/Socket/SSL.pm
这个依赖文件,但是我改了之后就会报 SSL 鉴定错误,故此不能这样做。
最终爬贴找到了这个帖子**1.56-overzealous-version-check.patch**
例子中是将 sendEmail 的 SSL_version 定义为 SSLv3,但是我使用的 QQ 邮箱和 Gmail 目前都在使用 TLSv1 协议,故此我需要将这个改成 TLSv1。
说回来我是 Docker 环境,故此我需要基于 zabbix/zabbix-server-mysql:latest 构建一个新的镜像。
1. 创建 Docker 构建文件夹
1
| mkdir ~/zabbix-server-mysql-sendEmail
|
2. 创建 Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| cat <<EOF | tee ~/zabbix-server-mysql-sendEmail/Dockerfile FROM zabbix/zabbix-server-mysql RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \ apk add --no-cache perl-crypt-ssleay perl-io-socket-ssl ca-certificates tzdata && \ wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz -P /tmp/ && \ tar xzf /tmp/sendEmail-v1.56.tar.gz -C /tmp/ && \ rm -f /tmp/sendEmail-v1.56.tar.gz && \ sed -i "s/SSL_version => 'SSLv3 TLSv1'/SSL_version => 'TLSv1'/g" /tmp/sendEmail-v1.56/sendEmail && \ mv /tmp/sendEmail-v1.56/sendEmail /usr/bin && \ chmod +x /usr/bin/sendEmail && \ rm -rf /tmp/* && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo "Asia/Shanghai" > /etc/timezone
EXPOSE 10051/TCP 162/UDP
WORKDIR /var/lib/zabbix
ENTRYPOINT ["/bin/bash"]
CMD ["/run_zabbix_component.sh", "server", "mysql"] EOF
|
3. 构建镜像
1 2
| cd ~/zabbix-server-mysql-sendEmail docker build -t nero/zabbix-server-mysql:latest .
|
4. 停止官方使用的镜像,启用新镜像
1 2 3 4 5 6 7 8 9 10 11 12 13
| docker rm -f zabbix-server #这里我之前启用镜像的时候使用的是别名 docker run --name zabbix-server \ --link zabbix-db:mysql-server \ --restart=always \ -e MYSQL_USER=zabbix \ -e MYSQL_PASSWORD=zabbix \ -e ZBX_IPMIPOLLERS=3 \ -e ZBX_STARTVMWARECOLLECTORS=5 \ -e ZBX_DEBUGLEVEL=3 \ -v /home/nero/zabbix/externalscripts:/usr/lib/zabbix/externalscripts \ -v /home/nero/zabbix/alertscripts:/usr/lib/zabbix/alertscripts \ -p 10051:10051 \ -d nero/zabbix-server-mysql
|
5. 编写 sendEmail 的发信脚本
参考自 Zabbix通过stmp邮件报警
我修改了下他的脚本,他脚本会自动转换字符编码,另外输出日志方便排查,但是日志不太详细,我给 sendEmail 加了 -v 参数。
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
| #!/bin/bash SMTP_server='smtp.qq.com:587' # SMTP服务器,我用 QQ TLS 的端口。 username='email@email.com' # 用户名 password=' smtp_password' # 密码 from_email_address='email@email.com' # 发件人Email地址 to_email_address="$1" # 收件人Email地址,zabbix传入的第一个参数 message_subject_utf8="$2" # 邮件标题,zabbix传入的第二个参数 message_body_utf8="$3" # 邮件内容,zabbix传入的第三个参数
echo "`date +"%F %T"` send to $to_email_address" >> /tmp/send.log
# 转换邮件标题为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" bhnaqekboudsdcca # 转换邮件内容为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 -o tls=yes -v >> /tmp/send.log
echo $? >> /tmp/send.log echo "zabbix 参数1 = $1" >> /tmp/send.log echo "zabbix 参数2 = $2" >> /tmp/send.log echo "zabbix 参数3 = $3" >> /tmp/send.log echo >> /tmp/send.log echo >> /tmp/send.log echo >> /tmp/send.log
|
Zabbix 设置邮件告警
我这里的 Zabbix 版本是3.2版本,不同版本界面略有不同,据说2.0的版本不需要加脚本参数,3.0开始需要加脚本参数了。
1. 创建报价媒介类型
2. 输入报警媒介类型参数
这里注意,脚本参数顺序不要错,否则会导致发信失败。
脚本参数 |
参数 |
注释 |
第一个参数 |
{ALERT.SENDTO} |
目的邮箱地址 |
第二个参数 |
{ALERT.SUBJECT} |
邮件主题 |
第三个参数 |
{ALERT.MESSAGE} |
邮件内容 |
3. 配置用户收信邮箱
4. 配置动作
这里我建立一个触发器警告,当触发器条件为真的时候,就发出警告邮件。
注意这里事件源选择触发器
按图片重复添加动作条件
1 2 3 4 5 6 7 8 9 10 11
| 默认接收人:『服务器警报』 {HOST.NAME}:{ITEM.NAME}
默认信息: 告警主机: {HOSTNAME1} 告警时间: {EVENT.DATE} {EVENT.TIME} 告警等级: {TRIGGER.SEVERITY} 告警信息: {TRIGGER.NAME} 告警项目: {TRIGGER.KEY1} 问题详情: {ITEM.NAME}: {ITEM.VALUE} 当前状态: {TRIGGER.STATUS}: {ITEM.VALUE1} 事件ID: {EVENT.ID}
|
其余参数按照图片设置,目前还没理解透这里所有选项,这里就不班门弄斧。
这里是触发器值为假后的操作,你可以自定义恢复公式,也可以按照原来的公式为假后发送邮件,告诉我们这个监控值正常了。
里面的内容除了默认接收人也就是邮件标题外,其余内容和上面的一样。
调试邮件告警
监控邮件发送日志,就可以调试邮件的发送状态了。
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
| docker exec -it zabbix-server tail -f /tmp/send.log 2017-07-12 17:53:07 send to neroxps@gmail.com Jul 12 17:53:07 1890ce4a57bf sendEmail[172]: DEBUG => Connecting to smtp.qq.com:587 Jul 12 17:53:07 1890ce4a57bf sendEmail[172]: DEBUG => My IP address is: 172.17.0.3 Jul 12 17:53:07 1890ce4a57bf sendEmail[172]: SUCCESS => Received: 220 smtp.qq.com Esmtp QQ Mail Server Jul 12 17:53:07 1890ce4a57bf sendEmail[172]: INFO => Sending: EHLO Jul 12 17:53:07 1890ce4a57bf sendEmail[172]: SUCCESS => Received: 250-smtp.qq.com, 250-PIPELINING, 250-SIZE 73400320, 250-STARTTLS, 250-AUTH LOGIN PLAIN, 250-AUTH=LOGIN, 250-MAILCOMPRESS, 250 8BITMIME Jul 12 17:53:07 1890ce4a57bf sendEmail[172]: INFO => Sending: STARTTLS Jul 12 17:53:07 1890ce4a57bf sendEmail[172]: SUCCESS => Received: 220 Ready to start TLS Jul 12 17:53:07 1890ce4a57bf sendEmail[172]: DEBUG => TLS session initialized :) Jul 12 17:53:07 1890ce4a57bf sendEmail[172]: INFO => Sending: EHLO Jul 12 17:53:07 1890ce4a57bf sendEmail[172]: SUCCESS => Received: 250-smtp.qq.com, 250-PIPELINING, 250-SIZE 73400320, 250-AUTH LOGIN PLAIN, 250-AUTH=LOGIN, 250-MAILCOMPRESS, 250 8BITMIME Jul 12 17:53:07 1890ce4a57bf sendEmail[172]: DEBUG => SMTP-AUTH: Using LOGIN authentication method Jul 12 17:53:07 1890ce4a57bf sendEmail[172]: INFO => Sending: AUTH LOGIN Jul 12 17:53:07 1890ce4a57bf sendEmail[172]: SUCCESS => Received: 334 VXNlcm5hbWU6 Jul 12 17:53:07 1890ce4a57bf sendEmail[172]: INFO => Sending: Jul 12 17:53:07 1890ce4a57bf sendEmail[172]: SUCCESS => Received: 334 UGFzc3dvcmQ6 Jul 12 17:53:07 1890ce4a57bf sendEmail[172]: INFO => Sending: Jul 12 17:53:08 1890ce4a57bf sendEmail[172]: SUCCESS => Received: 235 Authentication successful Jul 12 17:53:08 1890ce4a57bf sendEmail[172]: DEBUG => User authentication was successful (Method: LOGIN) Jul 12 17:53:08 1890ce4a57bf sendEmail[172]: INFO => Sending: MAIL FROM:<email@email.com> Jul 12 17:53:08 1890ce4a57bf sendEmail[172]: SUCCESS => Received: 250 Ok Jul 12 17:53:08 1890ce4a57bf sendEmail[172]: INFO => Sending: RCPT TO:<neroxps@gmail.com> Jul 12 17:53:08 1890ce4a57bf sendEmail[172]: SUCCESS => Received: 250 Ok Jul 12 17:53:08 1890ce4a57bf sendEmail[172]: INFO => Sending: DATA Jul 12 17:53:08 1890ce4a57bf sendEmail[172]: SUCCESS => Received: 354 End data with <CR><LF>.<CR><LF> Jul 12 17:53:08 1890ce4a57bf sendEmail[172]: INFO => Sending message body Jul 12 17:53:08 1890ce4a57bf sendEmail[172]: Setting content-type: text/plain Jul 12 17:53:08 1890ce4a57bf sendEmail[172]: SUCCESS => Received: 250 Ok: queued as Jul 12 17:53:08 1890ce4a57bf sendEmail[172]: Email was sent successfully! From: <email@email.com> To: <neroxps@gmail.com> Subject: [『服务器警报恢复』 Gen8-ipmi:02-CPU] Server: [smtp.qq.com:587] 0 zabbix 参数1 = neroxps@gmail.com zabbix 参数2 = 『服务器警报恢复』 Gen8-ipmi:02-CPU zabbix 参数3 = 告警主机: Gen8-ipmi 告警时间: 2017.07.12 17:50:58 告警等级: High 告警信息: Gen8-ipmi CPU温度过高-test006 告警项目: 02-CPU 问题详情: 02-CPU: 40 ℃ 当前状态: OK: 40 ℃ 事件ID: 4858
|