zabbix4.0 邮件报警和企业微信报警设置

添加邮件监控

主机环境:腾讯云
邮件服务:mailx
发送邮件服务器:126邮箱,465端口(25端口被封)


image.png

腾讯云默认限制云服务器的25端口,使用465端口
创建证书

echo -n | openssl s_client -connect smtp.126.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /usr/lib/zabbix/alertscripts/certs/126.crt
certutil -A -n "GeoTrust SSL CA" -t "C,," -d /usr/lib/zabbix/alertscripts/certs/ -i /usr/lib/zabbix/alertscripts/certs/126.crt
certutil -A -n "GeoTrust Global CA" -t "C,," -d /usr/lib/zabbix/alertscripts/certs/ -i /usr/lib/zabbix/alertscripts/certs/126.crt
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu"  -d ./ -i ./126.crt
certutil -L -d /usr/lib/zabbix/alertscripts/certs

配置mailx

1.如果安装有sendmail或者postfix,需要关闭
systemctl stop sendmail
systemctl disable sendmail
systemctl stop postfix
systemctl disable postfix
2.安装mailx
yum –y install mailx
3.配置mail.rc
vim /etc/mail.rc
## mail configure
set [email protected]
set smtp=smtps://smtp.126.com:465    #smtp服务器
set [email protected] #邮箱
set smtp-auth-password=xxxxxx #授权密码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/usr/lib/zabbix/alertscripts/certs
测试mailx是否生效
echo "邮件正文" | mail -s "邮件主题" [email protected]
如果收到邮件,说明配置成功
4.mail脚本
cd /usr/lib/zabbix/alertscripts
[root@VM_0_3_centos alertscripts]# cat mail.sh 
#!/bin/bash
#send mail
messages=`echo $3 | tr '\r\n' '\n'`
subject=`echo $2 | tr '\r\n' '\n'`
echo "${messages}" | mail -s "${subject}" $1 >>/tmp/mailx.log 2>&1
测试脚本是否生效
./mail.sh [email protected] "scrits" "test"
如果可以收到邮件,说明脚本配置正确

报错解决:

Error initializing NSS: Unknown error -8015.
. . . message not sent.
Error initializing NSS: Unknown error -8015.
. . . message not sent.

如果

echo "${messages}" | mail -s "${subject}" $1 >>/tmp/mailx.log 2>&1
测试脚本是否生效
./mail.sh [email protected] "scrits" "test"

两种方式都可以接收到邮件但是zabbix报警无法发送报警邮件,并且还报错Error initializing NSS: Unknown error -8015.
说明是证书权限问题


image.png

修改权限即可,注意telnet smpt.126.com 465 端口是通的,说明网络没有问题

zabbix web端配置

报警媒介配置


image.png

配置用户


image.png

配置动作
image.png

image.png

image.png

image.png

将主机的agent停掉,测试看能否收到邮件,有可能被发送到垃圾邮箱,需要设置一下。

.企业微信报警添加

配置企业微信报警
企业微信注册地址:企业微信注册

image.png

创建部门,添加运维人员
image.png

创建应用
image.png

记住这个AgentId和Secret,后面脚本会用到
image.png

我的企业-企业信息-查看企业ID,后面脚本会用到
image.png

查看部门ID

image.png

企业微信api调用:http://work.weixin.qq.com/api/devtools/devtool.php
image.png

zabbix脚本

[root@VM_0_3_centos ~]# cd /usr/lib/zabbix/alertscripts/
[root@VM_0_3_centos alertscripts]# cat wechat.sh 
#!/bin/bash
#填写我们的应用CropID
CropID='******************'
#应用的Secret,下面的GURL和PURL 地址无需变动
Secret='*******************************'
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"
#Gtoken=$(/usr/bin/curl -s -G $GURL | awk -F\" '{print $4}')
Gtoken=$(/usr/bin/curl -s -G $GURL | awk -F\" '{print $10}')
PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken"
 
function body() {
         local int AppID=1000002     #创建应用的ID
         local UserID=$1                    #接收消息用户,我们在部门里面添加的用户,如果有其他人,用逗号代替部门成员id,zabbix中定义的微信接收者
         local PartyID=2                     #接受消息的部门ID,定义了范围,组内成员都可接收到消息
         local Msg=$(echo "$@" | cut -d" " -f3-)
         printf '{\n'
         printf '\t"touser": "'"$UserID"\"",\n"
         printf '\t"toparty": "'"$PartyID"\"",\n"
         printf '\t"msgtype": "text",\n'
         printf '\t"agentid": "'" $AppID "\"",\n"
         printf '\t"text": {\n'
         printf '\t\t"content": "'"$Msg"\""\n"
         printf '\t},\n'
         printf '\t"safe":"0"\n'
         printf '}\n'
}
[root@VM_0_3_centos alertscripts]# chown zabbix.zabbix wechat.sh 
[root@VM_0_3_centos alertscripts]# chmod 744 wechat.sh 
测试(第一参数changhuanyan是部门中的用户,第二个参数是subject,第三个参数标题)
[root@VM_0_3_centos alertscripts]# sh wechat.sh changhuanyan test test
{"errcode":0,"errmsg":"ok","invaliduser":""}

手机可以看到你发的消息就是测试成功了。

image.png

zabbix web界面设置
image.png

{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}

创建用户


image.png

image.png

image.png

配置动作


image.png

image.png

注:默认的步骤是1-1,也即是从1开始到1结束。一旦故障发生,就是执行sendEmail.sh脚本发生报警邮件给Admin用户 和zabbix administrator组。
假如故障持续了1个小时,它也只发送一次。如果改成1-0,0是表示不限制.无限发送
间隔就是默认持续时间60秒。那么一个小时,就会发送60封邮件。
image.png

image.png

image.png
服务器:{HOST.NAME}发生: {TRIGGER.NAME}故障!
{
告警主机:{HOST.NAME}
告警地址:{HOSTNAME1}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
告警等级:{TRIGGER.SEVERITY}
当前状态:{TRIGGER.STATUS}
告警信息:{TRIGGER.NAME}
告警时间:{EVENT.DATE} {EVENT.TIME}
事件ID:{EVENT.ID}
}
---------------
---------------
服务器:{HOST.NAME}: {TRIGGER.NAME}已恢复!
{
告警主机:{HOST.NAME}
告警地址:{HOSTNAME1}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
告警等级:{TRIGGER.SEVERITY}
当前状态:{TRIGGER.STATUS}
告警信息:{TRIGGER.NAME}
告警时间:{EVENT.DATE} {EVENT.TIME}
恢复时间:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
持续时间:{EVENT.AGE}
事件ID:{EVENT.ID}
}
----------------------
----------------------
服务器:{HOST.NAME}: 报警确认
{
确认人:{USER.FULLNAME}
时间:{ACK.DATE} {ACK.TIME}
确认信息如下:{ACK.MESSAGE}
问题服务器IP:{HOSTNAME1}
问题ID:{EVENT.ID}
当前的问题是: {TRIGGER.NAME}
}
image.png

参考http://www.wqblogs.com/%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2zabbix4-0%EF%BC%8C%E9%85%8D%E7%BD%AE%E5%BE%AE%E4%BF%A1%E6%8A%A5%E8%AD%A6/

问题:

使用了一段时间发现配置web报警时,因为监控项中有双引号以及空格,会被截断,发出的报警如下

监控项:
    Response time for step "zabbix front" of scenario "zabbix frontend".
企业报警信息:
server发生: zabbix_frontend web down alert故障! {
 告警主机:zabbix server
 告警地址:118.25.101.253
 监控项目:

所以更改脚本中的截取

15 local Msg=$(echo "$@" | cut -d" " -f3-$#)
27 /usr/bin/curl --data-ascii "$(body $1 $2 ${@:3})" $PURL
${@:3}代表将后面的数据都作为$3的数据,MSg截取也更改为截取$3以及后面的所有参数
在本地shell脚本中执行可以生效,但是发送报警信息还是被截取

所以果断更改shell脚本为python脚本,如下:

#!/usr/local/python3/bin/python3
# -*- coding:utf-8 -*-
import requests
import json
import sys


# 企业号及应用相关信息
corp_id = 'ww1921xxxx91df71'
corp_secret = 'iJJq9ykT4boDDqEOaxxxxxxxR4sjy9C7k'
agent_id = 1000002
# 存放access_token文件路径
file_path = '/tmp/access_token.log'


def get_access_token_from_file():
    try:
        f = open(file_path,'r+')
        this_access_token = f.read()
        print('get success %s' % this_access_token)
        f.close()
        return this_access_token
    except Exception as e:
        print(e)

# 获取token函数,文本里记录的token失效时调用
def get_access_token():
    get_token_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s' % (corp_id, corp_secret)
    print(get_token_url)
    r = requests.get(get_token_url)
    request_json = r.json()
    this_access_token = request_json['access_token']
    print(this_access_token)
    r.close()
    # 把获取到的access_token写入文本
    try:
        f = open(file_path,'w+')
        f.write(this_access_token)
        f.close()
    except Exception as e:
        print(e)

    # 返回获取到的access_token值
    return this_access_token


# snedMessage
# 死循环,直到消息成功发送
flag = True
while(flag):
    # 从文本获取access_token
    access_token = get_access_token_from_file()
    try:
        # to_user = '@all'      ## 注意这样的话会发给所有人
        to_user = sys.argv[1]    ##这样zabbix中的参数才会有效
        title = sys.argv[2]
        message = sys.argv[3]
        send_message_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s' % access_token
        print(send_message_url)
        message_params = {
                            "touser":to_user,
                            "msgtype":"text",
                            "agentid":agent_id,
                            "text":{
                                "content" : title + '\n' + message
                            },
                            "safe": 0
                        }
        r = requests.post(send_message_url, data=json.dumps(message_params))
        print('post success %s ' % r.text)
        # 判断是否发送成功,如不成功则跑出异常,让其执行异常处理里的函数
        request_json = r.json()
        errmsg = request_json['errmsg']
        if errmsg != 'ok': raise
        # 消息成功发送,停止死循环
        flag = False
    except Exception as e:
        print(e)
        access_token = get_access_token()

将此脚本放入到/usr/lib/zabbix/alertscripts中,并一定要注意wetchat.py和/tmp/access_token.log的权限属主为zabbix,否则无法发送报警。

[root@VM_0_3_centos alertscripts]# ll
total 16
-rwxr--r-- 1 zabbix zabbix  165 Apr  9 18:10 mail.sh
-rwxr--r-- 1 zabbix zabbix 2413 Apr 26 11:39 wechat.py
-rwxr--r-- 1 zabbix zabbix 1312 Apr 26 14:18 wechat.sh
-rwxr--r-- 1 zabbix zabbix 1331 Apr 24 22:19 wechat.sh.bak
[root@VM_0_3_centos alertscripts]# pwd
/usr/lib/zabbix/alertscripts
[root@VM_0_3_centos alertscripts]# ls -al /tmp/access_token.log 
-rw-r--r-- 1 zabbix zabbix 214 Apr 26 12:17 /tmp/access_token.log

更改web中的脚本名称即可,


image.png

参考:

http://www.ttlsa.com/zabbix/use-wechat-send-zabbix-msg/

注意1:

运行一段时间上述python脚本,发现zabbix分组报警不生效,即使将用户停用了居然还可以发出报警,查看脚本发现

    try:
        to_user = '@all'      ## 注意这样的话会发给所有人
        title = sys.argv[2]
        message = sys.argv[3]
        send_message_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s' % access_token

脚本中是发送给企业微信中所有人的,所以zabbix上的更改才会不生效,只需要将

to_user = '@all'      ## 注意这样的话会发给所有人

更改为

to_user =  sys.argv[1]   ## zabbix传递过来的参数

特此记录

注意2:

如果发现wechat.py脚本无法发出报警,在网络没有问题的情况下请注意权限,手动执行./usr/lib/zabbix/alertscripts/wechat.py changhuanyan test test 可以正常发送,但是zabbix端无法发送时,要注意脚本中/tmp/access_token.log的权限!!!

[root@VM_20_3_centos alertscripts]# ls -al /tmp/access_token.log
-rw-r--r-- 1 zabbix zabbix 214 Aug 26 19:13 /tmp/access_token.log

你可能感兴趣的:(zabbix4.0 邮件报警和企业微信报警设置)