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