Zabbix 邮件警告

触发器邮件警告

Zabbix 默认的邮箱警告有个 SMTP HELO 的值,我一直不知道怎么填写,反正这个值一直报错,网上爬文一堆都是通过脚本来发邮件的。

部署 sendEmail 环境

参考文献1:Zabbix通过stmp邮件报警

参考文献2:zabbix 3.0.2邮件报警

这里需要用到 sendEmail 下载地址,它是基于 perl 写的一个脚本,如果用 SSL 加密的话需要依赖 perl 的 Net::SSLeayIO::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. 创建报价媒介类型

zabbix-01

2. 输入报警媒介类型参数

zabbix-02

这里注意,脚本参数顺序不要错,否则会导致发信失败。

脚本参数 参数 注释
第一个参数 {ALERT.SENDTO} 目的邮箱地址
第二个参数 {ALERT.SUBJECT} 邮件主题
第三个参数 {ALERT.MESSAGE} 邮件内容

3. 配置用户收信邮箱

zabbix-03


zabbix-04


zabbix-05


zabbix-06

4. 配置动作

这里我建立一个触发器警告,当触发器条件为真的时候,就发出警告邮件。

zabbix-07

注意这里事件源选择触发器


按图片重复添加动作条件

zabbix-08


zabbix-09

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}

其余参数按照图片设置,目前还没理解透这里所有选项,这里就不班门弄斧。


zabbix-10

这里是触发器值为假后的操作,你可以自定义恢复公式,也可以按照原来的公式为假后发送邮件,告诉我们这个监控值正常了。

里面的内容除了默认接收人也就是邮件标题外,其余内容和上面的一样。

调试邮件告警

监控邮件发送日志,就可以调试邮件的发送状态了。

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