github地址

https://github.com/JPOPS/Monitor/tree/master/zabbix-police

简书地址

http://www.jianshu.com/p/b29cf0682b58

架构图

zabbix设置

1、zabbix actions

ActionsDefault subject

Default subject

{EVENT.ID}_1

• Recovery subject

{EVENT.ID}_0

• Recovery message

triggervalue|{TRIGGER.VALUE}#hostname|
{HOSTNAME1}#ipaddress|
{IPADDRESS}#hostgroup|
{TRIGGER.HOSTGROUP.NAME}#tri ggernseverity|
{TRIGGER.NSEVERITY}#triggername|
{TRIGGER.NAME}#triggerkey|
{TRIGGER.KEY1}#triggeritems|
{ITEM.NAME}#item value|
{ITEM.VALUE}#eventid|{EVENT.ID}

Media types

subject

http://www.jianshu.com/p/b29cf0682b58PIP http://www.jianshu.com/p/e39a82c4edc3
Redis http://www.jianshu.com/p/2c686e077253
police.py
$ cat /soft/zabbix/share/zabbix/alertscripts/police.py #!/usr/local/python2.7.8/bin/python#coding:utf-8import redis
import syssubject=sys.argv[1]r = redis.StrictRedis(host='127.0.0.1', port=6379) r.set(subject,subject)
allpolice.py–(dbread.pyoperation.pydingding.py)x

 $ cat /data/dingding/allpolice.py

#!/usr/local/python2.7.8/bin/python #coding:utf-8
import MySQLdb
import redis
import sys
from dbread import *
from operation import *
from dingding import *
import datetime,time
sendtime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())) accesstoken = gettoken()
users=['ethnicity']
#zabbix IDactionid
actionid=134
#redisid
r = redis.StrictRedis(host='127.0.0.1', port=6379)
subjectlist=r.keys() for i in subjectlist: r.delete(i) r.flushdb()
#
originallist=[]
for subject in subjectlist: a=alerts_eventid(str(actionid),subject) originallist.append(a) problem=mergeproblem(originallist) normal=mergenormal(originallist)
# messagelist=compressproblem(problem) if len(messagelist) != 0:
for content in messagelist:
print sendtime
for user in users: senddata(accesstoken,user,content)
#
messagelist=compressnormal(normal)
if len(messagelist) != 0:
for content in messagelist:
print sendtime
for user in users: senddata(accesstoken,user,content)
dbread.py–idzabbix
$ cat /data/dingding/dbread.py

#!/usr/local/python2.7.8/bin/python #coding:utf-8
#*****
import MySQLdb
import datetime,time
import sys
#actionidsubject
def alerts_eventid(actionid,subject):
try: conn=MySQLdb.connect(host='xxxxxxxxxxxxxxx',user='xxxxxxxxxxxxxxxxx',passwd='xxxxxxxxxxxxxxxxxxxx',db='xxxxxxxxxxxxxx ',port=3306)
#hostzabbixip
#userzabbix
#passwdzabbix
#dbzabbix
cursor = conn.cursor()
cursor.execute("SET NAMES utf8");
sql = "SELECT * FROM alerts where actionid = '%s' and subject = '%s' ;" % (actionid,subject)
cursor.execute(sql)
data = cursor.fetchall()
cursor.close()
conn.close()
event=data[0]
messagelist=[]
message=event[8]
messageone=message.split('#')
for i in messageone:
messagelist.append(i.split('|'))
print messagelist
messagedict=dict(messagelist)
return messagedict
except MySQLdb.Error,e:
print "Mysql Error %d: %s" % (e.args[0], e.args[1])
$ cat /data/dingding/operation.py

 #!/usr/local/python2.7.8/bin/python #coding:utf-8
#
def mergeproblem(originallist): problemlist=[]
normalist=[]
Unknown=[]
triggerkeylist=[]
sorts=[]
alarminfo=[]
#or
if origina['triggervalue']=='1' : problemlist.append(origina)
if origina['triggerkey'] not in triggerkeylist: triggerkeylist.append(origina['triggerkey']) else :
for triggerkey in triggerkeylist:
for problem in problemlist:
if problem['triggerkey']==triggerkey: sorts.append(problem) alarminfo.append(sorts)
sorts=[]
return alarminfo
#
def mergenormal(originallist): normallist=[]
Unknown=[]
triggerkeylist=[]
sorts=[]
alarminfo=[]
#or
if origina['triggervalue']=='0' : normallist.append(origina)
if origina['triggerkey'] not in triggerkeylist: triggerkeylist.append(origina['triggerkey']) else :
for triggerkey in triggerkeylist:
for normal in normallist:
if normal['triggerkey']==triggerkey: sorts.append(normal) alarminfo.append(sorts)
sorts=[]
return alarminfo
#
def compressproblem(alarminfo):
currenttime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))
messagelist=[]
for info in alarminfo:
hostlist=''
hostgroup=''
infonum=len(info)
for host in info:
triggername=host['triggername']
hostinfo=host['hostname']+':'+host['ipaddress']+'\n'
if host['hostgroup'] not in hostgroup:
hostgroup+=host['hostgroup']+'\n'
hostlist+=hostinfo
if infonum >= 3 and infonum <= 6: message='\n'+':'+str(infonum)+'\n'+hostlist+':\n'+hostgroup+':\n'+triggername+'\n'+':\n'+currenttime messagelist.append(message)
elif infonum > 6:
message='\n'+',!\n\n'+':'+str(infonum)+'\n'+':\n'+triggername+'\n'+':\n'+currenttime messagelist.append(message)
return messagelist
#
def compressnormal(alarminfo):
currenttime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))
messagelist=[]
for info in alarminfo:
hostlist=''
hostgroup=''
infonum=len(info)
for host in info:
triggername=host['triggername']
hostinfo=host['hostname']+':'+host['ipaddress']+'\n'
if host['hostgroup'] not in hostgroup:
hostgroup+=host['hostgroup']+'\n'
hostlist+=hostinfo
if infonum >= 3 and infonum <= 6: message='\n'+':'+str(infonum)+'\n'+hostlist+':\n'+hostgroup+':\n'+triggername+'\n'+':\n'+currenttime messagelist.append(message)
elif infonum > 6:
message='\n'+'!\n\n'+':'+str(infonum)+'\n'+':\n'+triggername+'\n'+':\n'+currenttime messagelist.append(message)
return messagelist

$ cat /data/dingding/dingding.py

#!/usr/local/python2.7.8/bin/python
# coding: utf-8
#python2zabbix
#*****
import urllib,urllib2
import json
import sys
reload(sys)
sys.setdefaultencoding('utf8')
#import sys
def gettoken():
CorpID='xxxxxxxxxxxxxxxxxxxx'
CorpSecret='xxxxxxxxxxxxxxxxxxxx' GURL="https://oapi.dingtalk.com/gettoken?corpid="+CorpID+"&corpsecret="+CorpSecret token_file = urllib2.urlopen(GURL)
token_data = token_file.read().decode('utf-8')
token_json = json.loads(token_data)
token_json.keys()
token = token_json['access_token']
return token
def senddata(access_token,user,content): PURL="https://oapi.dingtalk.com/message/send?access_token="+access_token send_values = {
# "touser": "01174309736541088",
"touser": "@all",
"agentid": "37166352",
"msgtype": "text",
"text": {
"content": content
},
"safe" : "0" }
headers = {
"Content-Type": "application/json" }
send_data = json.dumps(send_values, ensure_ascii=False) send_request = urllib2.Request(PURL, send_data, headers=headers) response = json.loads(urllib2.urlopen(send_request).read())
print str(response)
if __name__ == '__main__':

crontab

##zabbix

*/5 * * * * /usr/local/python2.7.8/bin/python /data/dingding/allpolice.py && rm -rf /data/dingding/*.pyc>> /data/dingding/send.log

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐