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}动作等和 邮件告警配置一致