Zabbix-告警方式-邮件告警|微信告警

Zabbix告警的流程:

触发器(Trigger)告警触发 ---> 操作条件(根据Actions内的配置进行判断)  ---> 触发操作(执行Actions内的Operations)  --> 根据用户或用户组内包含的Media types来发送告警(方式由邮件,微信,短信,电话,其他)

Web操作条件(Actions内)设置

 

 Web触发操作(执行Actions内的Operations)

 

  Web用户组的Media types

 

 

 

 Web中的Media types

 注:Web页面的配置时反向配置;

 邮箱告警

Centos7下安装配置Mailx

#停掉邮箱相关服务
systemctl stop sendmail
systemctl stop postfix

#通过yum安装mailx
yum -y install mailx

#配置mailx
vim /etc/mail.rc
# 末尾加上
set from=17605262573@163.com  #邮箱地址
set smtp=smtp.163.com #邮箱smtp的服务器
set smtp-auth-user=17605262573@163.com #用户名
set smtp-auth-password=******* #密码
set smtp-auth=login # 设置登录

#测试邮件发送功能
echo Hello | mailx -s "mail-title" 17605262573@163.com

编写Mailx脚本

# 安装dos2unix
yum -y install dos2unix

python脚本

#!/usr/local/python3/bin/python3
import os
import sys

argv = sys.argv # 通过sys.argv获取参数,返回值为一个元组,第一个元素为脚本名
send_to = argv[1]
sent_subject = argv[2]
send_context = argv[3]

# 命令一:用于执行mailx的命令
cmd1 = "mailx -s '{mail_title}' {send_to} < $FILE".format(
    mail_title=sent_subject,
    send_to=send_to,
) 
# 命令二:用于指定新建文件的文件名,变量$根据当前shell的进程号,生成文件名
cmd2 = "FILE='/tmp/alert_$$.tmp'"
# 命令三:将Zabbix传过来的信息,写入文件(因是win上的文本文件,直接传会变成附件)
cmd3 = "echo '{}'>$FILE".format(send_context)
# 命令四:将dos版的文件转换为unix格式的文本文件
cmd4 = "dos2unix $FILE"
# 使用os.popen()方法执行以上4步操作;
status = os.popen("{} && {} && {} && {}".format(cmd2, cmd3, cmd4, cmd1))
#with open("/tmp/aaa.txt", 'a', encoding="utf-8") as f:
#    f.write(status)

SHELL脚本

##SHELL脚本##
#!/bin/bash
SENT_TO=$1
SENT_SUBJECT=$2
SENT_CONTENT=$3
# 四步操作
FILE='/tmp/alert_$$.tmp'
echo SENT_CONTENT > $FILE
dos2unix $FILE
mailx -s '$SEND_SUBJECT'  $SEND_TO < $FILE

 Web配置Media Types

以上脚本必须放在Zabbix目录下的share/zabbix/alertscripts/路径中,才可被调用到

 

 

微信告警

环境:

###方法一
# pip install requests
# pip install --upgrade requests
###方法二
# wget https://pypi.python.org/packages/c3/38/d95ddb6cc8558930600be088e174a2152261a1e0708a18bf91b5b8c90b22/requests-2.18.3.tar.gz
# tar zxvf requests-2.18.3.tar.gz
# cd requests-2.18.3
# python setup.py build
# python setup.py install 

脚本:

#!/usr/bin/python2.7
#_*_coding:utf-8 _*_
#auther:火星小刘

import requests,sys,json
import urllib3
urllib3.disable_warnings()

reload(sys)
sys.setdefaultencoding('utf-8')

def GetTokenFromServer(Corpid,Secret):
    Url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
    Data = {
        "corpid":Corpid,
        "corpsecret":Secret
    }
    r = requests.get(url=Url,params=Data,verify=False)
    print(r.json())
    if r.json()['errcode'] != 0:
        return False
    else:
        Token = r.json()['access_token']
        file = open('/tmp/zabbix_wechat_config.json', 'w')
        file.write(r.text)
        file.close()
        return Token

def SendMessage(User,Agentid,Subject,Content):
    try:
        file = open('/tmp/zabbix_wechat_config.json', 'r')
        Token = json.load(file)['access_token']
        file.close()
    except:
        Token = GetTokenFromServer(Corpid, Secret)

    n = 0
    Url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % Token
    Data = {
        "touser": "LiDaPeng",                     # 企业号中的用户帐号,在zabbix用户Media中配置,如果配置不正常,将按部门发送。
        #"totag": Tagid,                          # 企业号中的标签id,群发使用(推荐)
        "toparty": 1,                             # 企业号中的部门id,群发时使用。
        "msgtype": "text",                        # 消息类型。
        "agentid": 1000002,                       # 企业号中的应用id。
        "text": {
            "content": Subject + '\n' + Content
        },
        "safe": "0"
    }
    r = requests.post(url=Url,data=json.dumps(Data, ensure_ascii=False),verify=False) # 此处如果不写ensure_ascii=False,发送的邮件中中文会被显示成unicode
    while r.json()['errcode'] != 0 and n < 4:
        n+=1
        Token = GetTokenFromServer(Corpid, Secret)
        if Token:
            Url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % Token
            r = requests.post(url=Url,data=json.dumps(Data, ensure_ascii=False),verify=False) # 此处如果不写ensure_ascii=False,发送的邮件中中文会被显示成unicode
            print(r.json())

    return r.json()


if __name__ == '__main__':
    User = sys.argv[1]                                                                # zabbix传过来的第一个参数
    Subject = str(sys.argv[2])                                                        # zabbix传过来的第二个参数
    Content = str(sys.argv[3].decode("utf-8"))                                        # zabbix传过来的第三个参数
    Corpid = "wwc6b4925cd3d....."                                                     # CorpID是企业号的标识
    Secret = "RF35wdfvDjrsRzhpjiTY08k4Dk................."                            # 应用Secret是管理凭证密钥
    #Tagid = "1"                                                                      # 通讯录标签ID
    Agentid = "1000002"                                                               # 应用ID
    #Partyid = "2"                                                                    # 部门ID

    Status = SendMessage(User,Agentid,Subject,Content)
    print Status

Python3重写脚本

#!/usr/local/python3/bin/python3# @Author   : Bruce Lee
# python2 script is copy from 火星小刘
import requests
import json
import sys
import urllib3
urllib3.disable_warnings() # 忽略https请求时,证书异常所造成的告警

# 获取令牌<使用企业ID及应用Secret>
def GetTokenFromServer(Corpid, Secret):
    Url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
    Data = {
        "corpid": Corpid,
        "corpsecret": Secret
    }
    r = requests.get(url=Url, params=Data)
    print(r.json())
    if r.json()['errcode'] != 0:
        return False
    else:
        Token = r.json()['access_token']
        file = open('/tmp/zabbix_wechat_config_python3.json', 'w')
        file.write(r.text)
        file.close()
        return Token


# 向企业微信发送告警信息
def SendMessage(User, Agentid, Subject, Content, Corpid, Secret): try: with open('/tmp/zabbix_wechat_config_python3.json', 'r') as file: Token = json.load(file)["access_token"] except: Token = GetTokenFromServer(Corpid, Secret) n = 0 # 重试计数 Url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % Token Data = { "touuser": User, # 企业号中的用户帐号,在zabbix用户Media中配置,如果配置不正常,将按部门发送。 #"totag": Tagid, # 企业号中的标签id,群发使用(推荐) "toparty": 1, # 企业号中的部门id,群发时使用。 "msgtype": "text", # 消息类型。 "agentid": Agentid, # 企业号中的应用id。 "text": { "content": "{}\n{}".format(Subject, Content) }, "safe": "0" } r = requests.post(url=Url, data=json.dumps(Data, ensure_ascii=False).encode("utf-8")) # 重新尝试发送 while r.json()['errcode'] != 0 and n < 4: n += 1 Token = GetTokenFromServer(Corpid, Secret) if Token: Url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % Token r = requests.post(url=Url, data=json.dumps(Data, ensure_ascii=False).encode("utf-8")) return r.json() if __name__ == '__main__': User = sys.argv[1] Subject = sys.argv[2] Content = sys.argv[3] Corpid = "wwc6b4925cd......." Secret = "RF35wdfvDjrsRzhpjiTY0................................" # Tagid = "1" # 通讯录标签ID Agentid = "1000002" # 应用ID # Partyid = "2" Status = SendMessage(User, Agentid, Subject, Content, Corpid, Secret) print(Status)

测试:

# python /usr/local/zabbix/lib/zabbix/alertscripts/wechat.py 111 你好1 123
# python3 /usr/local/zabbix/lib/zabbix/alertscripts/wechat_python3.py 111 你好1 123
{u'invaliduser': u'', u'errcode': 0, u'errmsg': u'ok'}

Web配置:

配置方法同邮件告警

公众号的申请与设置参考这里

公众号内要查看的信息是:

企业号的标识:(我的企业-企业信息里)

 

 

管理凭证密钥:

应用ID:(应用管理-自建的小程序里面)

部门ID:(通讯录-右键即可看到)

 

 

 

企业号中的标签ID:添加标签方法:【登录企业号】->【通讯录】->【标签】->【新建标签】

注:现在企业微信客户端中可以设置,将信息发送到个人微信中;

end

posted @ 2019-12-27 20:35  FcBlogs  阅读(118)  评论(0编辑  收藏  举报