在zabbix的和业务系统的日常维护中免不了要频繁屏蔽掉告警,这里最方便的就是禁用掉相应的告警动作,由于要相当频繁的进行屏蔽,如果日常工作繁杂的话很容易忽略掉恢复,这里会有很大的隐患,今天笔者将带来一款对zabbix的告警动作进行审计的脚本,如下所示:
#!/usr/bin/env python
# encoding=utf-8
import logging
import requests
import time
from conf import action_id_list
import json
import sys
def logger_getter():
today = time.strftime("%Y-%m-%d", time.localtime())
logger = logging.getLogger()
if not len(logger.handlers):
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(asctime)s ||| %(levelname)s ||| %(lineno)d ||| %(funcName)s ||| %(message)s",
datefmt='%Y-%m-%d %H:%M:%S')
file_handler = logging.FileHandler('./logs/debug.log' + '.' + today)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
return logger
def send_msg_to_wework(chat_id, content):
print("hello")
diag = {"chatid": chat_id,
"msgtype": "markdown",
"markdown": {
"content": content}}
headers = {"Content-Type": "application/json"}
diag = json.dumps(diag)
requests.post('http://xxx.weixin.qq.com/cgi-bin/webhook/send?key=xxxxx',
data=diag, headers=headers)
def auth(api_url):
post_data_login = {
"jsonrpc" : "2.0",
"method" : "user.login",
"params" : {
"user" : "xxxxx",
"password" : "xxxxxxxx"
},
"id" : 1
}
"""获取 zabbix 登录令牌"""
ret = requests.post(api_url, data = json.dumps(post_data_login), headers = post_headers)
if 'result' in ret.text:
login_code = json.loads(ret.text).get("result")
print('auth success! , zabbix login code: %s' %login_code)
logger_getter().info('auth success! , zabbix login code: %s' %login_code)
return str(login_code)
elif 'error' in ret.text:
print('auth fails! , exiting')
logger_getter().error('auth fails! , exiting')
sys.exit(-1)
def zabbix_action_status_get(auth_code):
post_update_action = {
"jsonrpc": "2.0",
"method": "action.get",
"params": {
"output": "extend",
"selectOperations": "extend",
"selectRecoveryOperations": "extend",
"selectFilter": "extend"
},
"auth": auth_code,
"id": 1
}
ret = requests.post(url, data = json.dumps(post_update_action), headers = post_headers)
result=json.loads(ret.text)
return result
if __name__ == '__main__':
url = 'http://192.168.2.1/zabbix/api_jsonrpc.php'
post_headers = {'Content-Type': 'application/json'}
chat_id_prod = "xxxxxxxxxx"
auth_code = auth(url)
disabled_action_list = []
all_action_list = zabbix_action_status_get(auth_code)['result']
# print(all_action_list)
for action_specified_id in action_id_list:
for action_all in all_action_list:
# print("***")
action_all_id = action_all['actionid']
action_all_name = action_all['name']
action_all_status = action_all['status']
if action_specified_id == action_all_id and action_all_status == '1':
disabled_action_list.append('触发器名字:' + action_all_name)
if not disabled_action_list:
send_msg_to_wework(chat_id_prod,"# <font color='info'>** Zabbix告警动作审计正常! <@xxxx> <@xxxx><@xxxx>**</font>")
else:
send_msg_to_wework(chat_id_prod,"# <font color='warning'>** 以下Zabbix告警动作审计异常,请及时进行绑定!<@xxxx> <@xxxx><@xxxx>**</font>\n{0}".format('\n'.join(disabled_action_list)))
上述脚本将对禁用掉的告警动作通过企业微信机器人发出消息通知。
你需要准备一个叫conf.py的配置文件,里面配置上你需要进行审计的告警动作的id,如下:
action_id_list = ['11','23','34','45']
然后修改上述脚本的如下内容:
-
send_msg_to_wework()函数中企业微信机器人的api地址
-
auth()函数中zabbix的用户名和密码
-
第79行的zabbix server的api地址
-
第81行企业微信群的群聊id
-
倒数最后四行中你需要at的同事的企业微信英文名