Zabbix學習筆記(5) 郵件告警

設置完觸發器已經可以在前端消息中報警,但這並不方便,若沒有登入Zabbix或人不在位置上,就無法實時得到告警信息。

使用郵件告警來加強提醒效果,通常設置郵件告警有兩種方式,一種是Zabbix內建的郵件模板,另一種是自己寫python或sh腳本來實現。下面介紹的是第二種方法:利用python發信告警。

1. Python腳本

Zabbix可結合腳本告警,而用Python發信非常方便,只要是Linux系統通常都有內置Python,其中CentOS的yum工具就是用Python2所寫,如果要安裝Python3要留意避免版本衝突問題。

低安全性

要使用Gmail的話,需先至低安全性應用程式網頁中開放存取權限,否則會無法發送成功。

腳本路經

默認路徑:/usr/local/share/zabbix/alertscripts

也可以透過設定檔查看更改成其他路徑:/usr/local/etc/zabbix_server.conf

創建Python腳本

Python標準庫已內建SMTP模塊,不需安裝其他依賴,直接寫好腳本就可以發信。

創建一個Python腳本並命名為zabbix-alert-smtp.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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/bin/python
# -*- coding: utf-8 -*-

"""
Zabbix SMTP Alert script for gmail.
"""

import sys
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

# Mail Account
MAIL_ACCOUNT = 'your_account@gmail.com'
MAIL_PASSWORD = 'xxxx'

# Sender Name
SENDER_NAME = u'Zabbix Server Alert'

# Mail Server
SMTP_SERVER = 'smtp.gmail.com'
SMTP_PORT = 587

def send_mail(recipient, subject, body, encoding='utf-8'):

msg = MIMEText(body, 'plain', encoding)
msg['Subject'] = Header(subject, encoding)
msg['From'] = Header(SENDER_NAME, encoding)
msg['To'] = recipient
msg['Date'] = formatdate()

session = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
session.ehlo()
session.starttls()
session.ehlo()
session.login(MAIL_ACCOUNT, MAIL_PASSWORD)
session.sendmail(MAIL_ACCOUNT, recipient, msg.as_string())

# close session
session.quit()

if __name__ == '__main__':
send_mail(recipient=sys.argv[1],subject=sys.argv[2],body=sys.argv[3])
  • 小說明

    輸入自己Gmail的帳密

    1
    2
    MAIL_ACCOUNT = 'your_account@gmail.com'
    MAIL_PASSWORD = 'xxxx'
命令列參數

1
2
3
4
5
send_mail(recipient=sys.argv[1],subject=sys.argv[2],body=sys.argv[3])
sys.argv開頭的皆為命令列參數,後面會在補充與Zabbix的對應位置,方便理解為何此處要用命令列參數。
recipient 收件人
subject 主旨
body 內文

測試腳本

寄一封信給自己,主旨為”測試”,內文為”給自己”

1
python zabbix-alert-smtp.py ceshizhanghu1001@gmail.com 測試 給自己

寄送成功

2. 設定報警媒介

報警媒介可以依類型”電子郵件”、”短信”、”腳本”等,待觸發器發報時一併報警。

创建媒体类型

選單:”管理” -> “報警媒介類型” -> “创建媒体类型”

腳本信息

名稱:Gmail
類型:“腳本”
腳本名稱:zabbix-alert-smtp.py
(
路經:/usr/local/share/zabbix/alertscripts,
權限:777
)
腳本參數:
{ALERT.SENDTO} 收件人地址
{ALERT.SUBJECT} 主題
{ALERT.MESSAGE} 詳細內容

以上輸入的三個腳本參數,也就對應著py腳本的命令列參數,權限需留意否則無法發送成功。

添加完成

3. 設定用戶報警媒介”收件人”

選擇用戶

選單:”管理” -> “用戶” -> “Admin”

添加報警媒介

選單:”報警媒介” -> “添加”

報警媒介信息

類型:Gmail
收件人:ceshizhanghu1001@gmail.com(測試)

收件人地址,實際上是與腳本參數“{ALERT.SENDTO}”對應的。

添加完成

確認信息後按更新完成添加。

4. 設定動作

選單:”配置” -> “動作” -> “創建動作”

動作信息

名稱:Nginx1
條件:触发器 = PingHost: Nginx1

操作信息

默認接收人:(不變)
默認信息:(不變)
操作細節:添加”用戶”及”報警媒介”

默認接收人及默認信息,實際上就是對應腳本參數“{ALERT.SUBJECT}”“{ALERT.MESSAGE}”。若不希望接收訊息時都是全英文,那麼可以將非{}的文字改成中文,這樣並不會影響功能。

恢復操作信息

這部分與操作分頁設定相同,記得要添加操作細節(用戶及報警媒介)。

動作添加完成

5. 發信告警

由步驟”腳本”到”動作”設置完畢後,只要每當異常、恢復都會發信通知一次。

動作日誌

選單:”報表” -> “動作日誌”

Zabbix3.0以後新增的動作日誌功能非常好用,動作內容及是否成功通通都會顯示在這裡。

異常時通知

恢復時通知

小結

一開始接觸會認為步驟繁瑣了點,其實配置上都是圍繞著腳本參數所關聯的,明白其中相關關係,做出更多報警如:Telegram、Line、微信等都是沒有問題的。