分散式監控系統Zabbix-3.0.3-完整安裝記錄(5)-郵件報警部署

散盡浮華發表於2016-10-14

 

前面幾篇陸續介紹了zabbix3.0.3監控系統的部署和監控項配置,今天這裡分享下zabbix3.0.3的郵件報警的配置過程~
由於採用sendmail傳送郵件,常常會被認為是垃圾郵件被拒,所以不推薦這種方式!
這裡,針對zabbix報警資訊的傳送,可以採用下面兩種方式中的任意一種:
1)利用sendEmail程式來傳送報警郵件.sendEmail是一個輕量級,命令列的SMTP郵件客戶端,非常完美,使用簡單並且功能強大.這個被設計用在php、bash 、perl和web站點使用。
2)利用python指令碼來傳送郵件

一、利用sendemail傳送報警郵件
1)先下載安裝包到本地,解壓。
[root@Zabbix-server ~]# cd /usr/local/src/
[root@Zabbix-server src]# wget -c http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz
[root@Zabbix-server src]# tar -zvxf sendEmail-v1.56.tar.gz
[root@Zabbix-server src]# cd sendEmail-v1.56
[root@Zabbix-server sendEmail-v1.56]# cp -a sendEmail /usr/local/bin/
[root@Zabbix-server sendEmail-v1.56]# chmod +x /usr/local/bin/sendEmail
[root@Zabbix-server sendEmail-v1.56]# file /usr/local/bin/sendEmail
/usr/local/bin/sendEmail: a /usr/bin/perl -w script text executable

#檢視sendemail的幫助資訊
[root@Zabbix-server src]# cd sendEmail-v1.56
[root@Zabbix-server sendEmail-v1.56]# /usr/local/bin/sendEmail

sendEmail-1.56 by Brandon Zehm <caspian@dotconf.net>

Synopsis: sendEmail -f ADDRESS [options]

Required:
-f ADDRESS from (sender) email address
* At least one recipient required via -t, -cc, or -bcc
* Message body required via -m, STDIN, or -o message-file=FILE

Common:
-t ADDRESS [ADDR ...] to email address(es)
-u SUBJECT message subject
-m MESSAGE message body
-s SERVER[:PORT] smtp mail relay, default is localhost:25

Optional:
-a FILE [FILE ...] file attachment(s)
-cc ADDRESS [ADDR ...] cc email address(es)
-bcc ADDRESS [ADDR ...] bcc email address(es)
-xu USERNAME username for SMTP authentication
-xp PASSWORD password for SMTP authentication

Paranormal:
-b BINDADDR[:PORT] local host bind address
-l LOGFILE log to the specified file
-v verbosity, use multiple times for greater effect
-q be quiet (i.e. no STDOUT output)
-o NAME=VALUE advanced options, for details try: --help misc
-o message-content-type=<auto|text|html>
-o message-file=FILE -o message-format=raw
-o message-header=HEADER -o message-charset=CHARSET
-o reply-to=ADDRESS -o timeout=SECONDS
-o username=USERNAME -o password=PASSWORD
-o tls=<auto|yes|no> -o fqdn=FQDN


Help:
--help the helpful overview you're reading now
--help addressing explain addressing and related options
--help message explain message body input and related options
--help networking explain -s, -b, etc
--help output explain logging and other output options
--help misc explain -o options, TLS, SMTP auth, and more

2)安裝下依賴
[root@Zabbix-server sendEmail-v1.56]# yum install perl-Net-SSLeay perl-IO-Socket-SSL -y

[root@Zabbix-server sendEmail-v1.56]# /usr/local/bin/sendEmail -f from@huanqiu.cn -t to@huanqiu.cn -s smtp.huanqiu.cn -u "我是郵件主題" -o message-content-type=html -o message-charset=utf8 -xu from@huanqiu.cn -xp WEE78@12l$ -m "我是郵件內容"

命令說明:
/usr/local/bin/sendEmail                     #命令主程式
-f from@uhanqiu.cn                          #發件人郵箱
-t to@huanqiu.cn                              #收件人郵箱
-s smtp.huanqi.cn                            #發件人郵箱的smtp伺服器
-u "我是郵件主題"                               #郵件的標題
-o message-content-type=html          #郵件內容的格式,html表示它是html格式
-o message-charset=utf8                   #郵件內容編碼
-xu from@huanqiu.cn                       #發件人郵箱的使用者名稱
-xp WEE78@12l$                             #發件人郵箱密碼
-m "我是郵件內容"                             #郵件的具體內容

例如:
[root@Zabbix-server alertscripts]# /usr/local/bin/sendEmail -f ops@huanqiu.cn -t wangshibo@huanqiu.cn -s smtp.huanqiu.cn -u "我是郵件主題" -o message-content-type=html -o message-charset=utf8 -xu ops@huanqiu.cn -xp WEE78@12l$ -m "我是郵件內容"

Oct 14 19:38:29 zabbix-server sendEmail[65454]: Email was sent successfully!
[root@Zabbix-server alertscripts]#

登陸wangshibo@huanqiu.cn郵箱,發現已經收到了上面傳送的郵件:

3)下面開始設定zabbix的sendemail郵件傳送指令碼

進入zabbix自定義的指定目錄,我這裡是/usr/local/zabbix
可以檢視zabbix_server.conf配置檔案AlertScriptsPath變數是如何定義的。
找到AlertScriptsPath選項,可以自定義位置
[root@Zabbix-server sendEmail-v1.56]# cat /usr/local/zabbix/etc/zabbix_server.conf
.......
### Option: AlertScriptsPath
# Full path to location of custom alert scripts.
# Default depends on compilation options.
#
# Mandatory: no
# Default:
# AlertScriptsPath=${datadir}/zabbix/alertscripts

AlertScriptsPath=/usr/local/zabbix/alertscripts

[root@Zabbix-server sendEmail-v1.56]# cd /usr/local/zabbix/alertscripts/

下面是sendemail的郵件傳送指令碼(這個指令碼通用,確保了zabbix郵件報警資訊不會出現中文亂碼)

---------------------------------------------------------------------
下面我用的是阿里的企業郵件,smtp地址是smtp@huanqiu.cn
如果用163郵箱,smtp地址是smtp.163.com
如果是騰訊企業郵箱,smtp是smtp.exmail.qq.com
--------------------------------------------------------------------

[root@Zabbix-server alertscripts]# cat mail.sh
#!/bin/bash
#
# Filename: SendEmail.sh
# Revision: 1.0
# Date: 2014/07/04
# Author: Qicheng
# Email:
# Website: http://www.cnblogs.com/kevingrace/
# Description: zabbix郵件告警指令碼
# Notes: 使用sendEmail
#
# 指令碼的日誌檔案
LOGFILE="/tmp/Email.log"
:>"$LOGFILE"
exec 1>"$LOGFILE"
exec 2>&1
SMTP_server='smtp.huanqiu.cn'                            #SMTP伺服器,變數值需要自行修改
username='ops@huanqiu.cn'                                 #使用者名稱,變數值需要自行修改
password='WEE78@12l$'                                     #密碼,變數值需要自行修改
from_email_address='ops@huanqiu.cn'                  #發件人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/local/bin/sendEmail'
set -x
$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

[root@Zabbix-server alertscripts]# chmod 755 mail.sh
[root@Zabbix-server alertscripts]# touch /tmp/Email.log
[root@Zabbix-server alertscripts]# chown zabbix.zabbix /tmp/Email.log
[root@Zabbix-server alertscripts]# chown zabbix.zabbix mail.sh

測試指令碼傳送郵件
[root@Zabbix-server alertscripts]# ./mail.sh wangshibo@huanqiu.cn 主題 測試
[root@Zabbix-server alertscripts]#
登陸wangshibo@huanqiu.cn郵箱,發現已經收到了上面傳送的郵件:

4)接著,登陸zabbix介面,進行設定
注意:zabbix 3.0 需要在為alert指令碼定義引數,以前的版本引數都固定的,現在使用者可以自己定義命令列的引數了。新增的引數也就是指令碼中的$1、$2、$3等。

點選"管理"->"報警媒介型別"->點選最右邊的"建立媒體型別" 

輸入上面在alertscripts目錄下建立的指令碼名稱mail.sh,型別選擇指令碼並新增以下3個引數,
分別對應sendEmail.sh指令碼需要的3個引數:收件人地址、主題、詳細內容
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}

這裡注意一下:
安裝zabbix 3.0之後,寫的指令碼一直髮信不成功,手動執行時可以的。
那是因為zabbix3.0之後,可以自定義引數了。所以不寫引數,它是不會傳引數的。
在2.x版本不存在這個問題,預設會傳3個引數。

點選“管理”->“使用者"->"zabbix"  (我這裡的zabbix的管理員賬號是zabbix)

上面新增的是傳送給wangshibo@huanqiu.cn的報警設定,顯示如下:

如果是傳送給多人,那麼需要”新增“多個郵箱賬號!

 

點選“管理”->“使用者群組”,點選zabbix administrator後面的呼叫模式。

點選使用者群組Zabbix administrators的”許可權“,點選”新增“,選擇所有許可權 ,最後點選下面的”更新“

點選“配置”->“動作”,這裡可以點選右邊的“建立動作”(事件源是”觸發器“,也就是Triggers),也可以直接使用預設動作進行修改
這裡我選擇修改預設的Report problems to Zabbix administrators

 修改動作名稱為”zabbix報警“。

 

注意:
zabbix預設的告警內容不豐富,資訊不足,我做了如下的調整(預設資訊和恢復資訊是一致的):
告警主機:{HOST.NAME}
主機IP: {HOST.IP}
告警時間:{EVENT.DATE} {EVENT.TIME}
告警等級:{TRIGGER.SEVERITY}
告警資訊:{TRIGGER.NAME}
問題詳情:{ITEM.NAME}:{ITEM.VALUE}
當前狀態: {TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID: {EVENT.ID}

---------------------------------------------------------------------------------------------------------------------------
如上,在“配置”->“動作”裡的“條件”裡的設定
1)計算方式
設定為“與/或”,說明只要觸發其中任何一個都會發報警郵件
2)條件:
上面預設設定的是下面兩個:
A:維護狀態 非在 維護
B:觸發器值 = 問題

按照上面的設定後,當被監控主機當機或zabbix_agent(10050埠)關閉後,就會發生報警~

但是這些遠遠不能滿足我們的運維監控需求。
比如當被監控主機的根磁碟爆滿時,需要傳送報警郵件!這就需要額外新增上面“動作”裡的“條件”設定

如在“條件”裡追加“主機”和“模板”,將所監控的主機和被監控主機採用的模板都選上為觸發條件

這樣,當任何一個條件被觸發時,都會傳送報警郵件!

 

------------------------------------------------------------------------------------------------------------------------------------------------------------

設定“操作”,可以點選”新的“新增操作規則,也可以直接修改已有的操作規則:

預設的步驟是1-3,也即是從1開始到3結束。一旦故障發生,就是執行sendEmail.sh指令碼發生報警郵件給zabbix使用者和zabbix administrator組。
假如故障持續了1個小時,它也只傳送3次,第1-3次(即前3次)郵箱傳送給zabbix使用者,時間間隔為0秒。
如果改成1-0,0是表示不限制.無限傳送
間隔就是預設持續時間60秒。那麼一個小時,就會傳送60封郵件。
如果需要簡訊報警的話,可以再建立一條新的動作,選擇簡訊指令碼。

-------------------------------------------------------------
也可以在新增新的”操作“,比如上面前3次報警傳送給zabbix。
還可以再設定第30-35次報警(也就是報警事故已經發生30秒之後)傳送給另外的使用者
這樣,就建立了兩個"操作",上面我只建立了一個操作
-------------------------------------------------------------

這樣,zabbix利用sendemail傳送報警資訊的設定就已經完成了!

測試:

將192.168.1.19伺服器的zabbix_agent程式關閉。

 

發現可以正常收到故障報警郵件(收到3次郵件PROBLEM故障郵件):

待192.168.1.19伺服器的zabbix_agent程式恢復後,也有報警郵件(收到1次OK(恢復狀態)的郵件)。

最後,點選”報表“->”動作日誌“,可以看到觸發動作的次數(右邊還看檢視到郵件傳送狀態“已傳送”)。
故障報警只會有3次,除非test主機狀態改變,也就是正常恢復的時候,才會再觸發一次,否則不會再觸發。

 

 ------------------------------------------------------------------------------------------------------------------------------------------------------------

以上是zabbix利用sendemail傳送報警郵件的配置。
下面介紹下利用python指令碼傳送報警郵件的配置!

首先是建立python指令碼zabbix_sendemail.py,如下:
[root@Zabbix-server alertscripts]# pwd
/usr/local/zabbix/alertscripts

[root@Zabbix-server alertscripts]# cat zabbix_sendemail.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pdb
import smtplib
import string
import time
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
#pdb.set_trace()
#HOST = "mail.gw.com.cn"
def S_Mail():
    HOST = "smtp.huanqiu.cn"                           
    SUBJECT = sys.argv[2].decode('utf-8').encode('gbk')   
    TO =sys.argv[1]                                       
    FROM = "ops@huanqiu.cn"
    text = sys.argv[3].decode('utf-8').encode('gbk')      
    BODY = string.join((
                    "FROM: %s" % FROM,
                    "To: %s"  % TO,
                    "Subject: %s" %SUBJECT,
                    "",
                    text
                    ),"\r\n")
    server = smtplib.SMTP()
    server.connect(HOST,25)
    #server.starttls()
    server.login("ops@huanqiu.cn","WEE78@12l$")
    server.sendmail(FROM,[TO],BODY)
    server.quit()
# email log 記錄日誌
    with open('/data/logs/zabbix/Email.log','a') as f:
        date=time.strftime("%y-%m-%d %H:%M:%S")
        str = date + "    " + TO +"    " + SUBJECT + "\r\n" + "\n"
        str1 = str.decode('gbk').encode('utf-8')
#       print("%s" %str1)
        f.write(str1)
if __name__=='__main__':
    S_Mail()

[root@Zabbix-server alertscripts]# mkdir -p /data/logs/zabbix/

測試郵件傳送:
[root@Zabbix-server alertscripts]# ./zabbix_sendemail.py wangshibo@huanqiu.cn 主題 測試
[root@Zabbix-server alertscripts]#

然後登陸wangshibo@huanqiu.cn郵箱,發現已經收到郵件了。如下:

其他zabbix介面上的配置和上面差不多,只需要將mail.sh改為zabbix_sendemail.py即可!

相關文章