1、告警脚本

注:动作,等配置参考邮件告警

#!/usr/bin/python2.7  
#_*_coding:utf-8 _*_

import requests,sys,json,logging,time                                      # 导入requests模块用于发送HTTP请求,sys模块用于获取命令行参数,json模块用于处理JSON格式数据 日志模块时间模块
import urllib3                                                             # 导入urllib3模块用于禁用SSL证书验证
urllib3.disable_warnings()                                                 # 禁用SSL证书验证,避免HTTPS请求出现证书验证错误

reload(sys)                                                                # 重新加载sys模块,解决默认编码问题
sys.setdefaultencoding('utf-8')                                            # 设置默认编码为UTF-8,避免中文字符编码错误

####这个位置配置测试增加log日志信息和日期

logfile = 'log.txt'

def write_log(log):
timestamp = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
log_with_time = { 'timestamp': timestamp, 'log': log }
with open(logfile, 'a') as f:
f.write(json.dumps(log_with_time) + '\n')

##############################

这个测试配置只增加log

#def write_log(log):
# with open('/tmp/zabbix_wechat.log', 'a') as f:
# f.write(json.dumps(log) + '\n')

# 构造获取访问令牌的函数,输入企业号标识Corpid和管理组凭证密钥Secret,返回访问令牌Token

def GetTokenFromServer(Corpid,Secret):
Url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"                      # 构造获取访问令牌的API请求URL
Data = {                                                                  # 构造API请求参数
"corpid":Corpid,
"corpsecret":Secret
}
r = requests.get(url=Url,params=Data,verify=False)                        # 发送HTTP GET请求     
write_log(r.json())                                            # 输出API响应结果
if r.json()['errcode'] != 0:                                      # 判断获取令牌是否成功
return False                                                               # 如果获取失败则返回False 
else:
Token = r.json()['access_token']                                           # 提取访问令牌
file = open('/tmp/zabbix_wechat_config.json', 'w')                         # 创建/tmp/zabbix_wechat_config.json文件
file.write(r.text)                                                         # 将API响应写入文件
file.close()                                                               # 关闭文件
return Token                                                               # 返回访问令牌

# 构造发送消息的函数,输入接收人User、应用ID Agentid、消息主题Subject和消息内容Content,返回发送状态

def SendMessage(User,Agentid,Subject,Content):
try:
file = open('/tmp/zabbix_wechat_config.json', 'r')                         # 以只读方式打开/tmp/zabbix_wechat_config.json文件
Token = json.load(file)['access_token']                                    # 从文件中读取访问令牌
file.close()                                                               # 关闭文件
except:
Token = GetTokenFromServer(Corpid, Secret)                                 # 如果文件读取失败则重新获取访问令牌

n = 0                                                                      # 计数器n用于判断重发次数

# 构造发送消息API的请求URL和请求数据

Url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % Token
Data = {
"touser": "******",                       # 企业号中的用户帐号,在zabbix用户Media中配置,如果配置不正常,将按部门发送。
#"totag": Tagid,                          # 企业号中的标签id,群发使用(推荐)
"toparty": 2,                             # 企业号中的部门id,群发时使用。
"msgtype": "text",                        # 消息类型。
"agentid": 1000003,                       # 企业号中的应用id。
"text": {
"content": Subject + '\n' + Content                                      # 消息内容,由主题和内容拼接构成
},
"safe": "0"
}
r = requests.post(url=Url,data=json.dumps(Data, ensure_ascii=False),verify=False)    # 发送HTTP POST请求
write_log(r.json())
while r.json()['errcode'] != 0 and n < 4:                                # 如果发送失败,则尝试重新获取访问令牌并重发消息,最多尝试3次
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)
write_log(r.json())

return r.json()                                                          # 返回发送状态

# 如果该脚本为主体程序,则执行以下语句
if __name__ == '__main__':
User = sys.argv[1]                                                       # zabbix传过来的第一个参数
Subject = str(sys.argv[2])                                               # zabbix传过来的第二个参数
Content = str(sys.argv[3])                                               # zabbix传过来的第三个参数

write_log('User: %s, Subject: %s, Content: %s' % (User, Subject, Content))

Corpid = "****************"                                              # CorpID是企业号的标识
Secret = "****************************"                                  # Secret是管理组凭证密钥
#Tagid = "*"                                                             # 通讯录标签ID
Agentid = "*******"                                                      # 应用ID
Partyid = "*"                                                            # 部门ID

Status = SendMessage(User,Agentid,Subject,Content)                       # 调用发送消息函数,获取发送状态
write_log(str(Status))                                                   # 输出发送状态

脚本存放位置

默认放在AlertScriptsPath=/usr/lib/zabbix/alertscripts 也可通过zabbixserver.conf文件修改指定位置

2、配置媒介

配置消息模板

消息类型:问题
主题{告警通知} 

主机名称: {HOST.NAME}
主机地址: {HOST.IP}
故障日期: {EVENT.DATE}
故障时间: {EVENT.TIME}
问题事件: {EVENT.NAME}{EVENT.OPDATA}
事件编号: {EVENT.ID}
{TRIGGER.URL}
消息类型:问题恢复
主题{恢复通知} 

主机名称: {HOST.NAME}
主机地址: {HOST.IP}
恢复日期: {EVENT.RECOVERY.DATE} 
恢复时间: {EVENT.RECOVERY.TIME}
持续时间: {EVENT.DURATION}
事件描述: {EVENT.NAME}{EVENT.OPDATA}
事件编号: {EVENT.ID}
{TRIGGER.URL}

动作等和 邮件告警配置一致