前言

当你的企业的zabbix系统用了很多年之后肯定是积攒下来少说十几个多则几十个zabbix告警动作,由于历史原因经常有一半被永远禁用了,但是你又不敢随意的删掉它们,这样每次维护监控在禁用之前的时候你就需要记下来哪些是启用的,然后再在维护完之后小心翼翼的全部启用,确保一个不落,但是人的眼睛总是会走神,难免会有遗漏,即使是有双人复核恐怕也不能幸免。本文实现了用Python脚本批量一次性禁用和启用,原理就是提前把这些告警动作id多次或N次反反复复复核后写到配置文件里面,然后用Python脚本调用zabbix的rest api来批量操作。

实战

在当前目录新建logs目录,

$ mkdir logs

新建一个配置文件模块conf.py,如下:

action_id_list = ['11', '12', '13', '14', '15', '16', '17', '...']

上面这些id可以在点开每个告警动作的配置页面,然后在页面的url里面有个actionid=的查询字符串,等号后面就是id,自己记下来然后写入上述配置模块中。

下面直接上脚本:

#!/usr/bin/env python
# encoding=utf-8

import logging
import argparse
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 auth():
    post_data_login = {
    "jsonrpc" : "2.0",
    "method" : "user.login",
    "params" : {
        "user" : "admin",
        "password" : "admin12345"
    },
    "id" : 1
}
    """获取 zabbix 登录令牌"""
    ret = requests.post(url, data = json.dumps(post_data_login), headers = post_headers)
    if 'result' in ret.text: 
        login_code = json.loads(ret.text).get("result")
        logger_getter().info('auth success! , zabbix login code: %s' %login_code)
        return login_code
    elif 'error' in ret.text:
        logger_getter().error('auth fails! , exiting')
        sys.exit(-1) 

def switch_zabbix_action(auth_code, action_id, action_flag):
    post_update_action = {
    "jsonrpc": "2.0",
    "method": "action.update",
    "params": {
        "actionid": action_id,
        "status": action_flag
    },
    "auth": auth_code,
    "id": 1
   }

    ret = requests.post(url, data = json.dumps(post_update_action), headers = post_headers)
    result=json.loads(ret.text)
    logger_getter().debug(result)

    if 'result' in ret.text:
        if action_flag == '1':
            print('%s %s disable success!' %(action_flag, action_id))
            logger_getter().info('%s %s disable success!' %(action_flag, action_id))
        if action_flag == '0':
            print('%s %s enable success!' %(action_flag, action_id))
            logger_getter().info('%s %s enable success!' %(action_flag, action_id))
    elif 'error' in ret.text:
        print('%s %s fail! exiting' %(action_flag, action_id))
        logger_getter().error('%s %s fail! exiting' %(action_flag, action_id))
        sys.exit(-3)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description="A tool to switch zabbix action's status.")

    parser.add_argument(
        '-E', '--enable',
        action='store_true',
        help="enable the zabbix's action")

    parser.add_argument(
        '-D', '--disable',
        action='store_true',
        help="disable the zabbix's action")
    args = parser.parse_args()

    
    url = 'http://192.168.0.1/zabbix/api_jsonrpc.php'
    post_headers = {'Content-Type': 'application/json'}

    auth_code = auth()
    if args.disable:
        for action_id in action_id_list:
            switch_zabbix_action(auth_code, action_id, '1')
        sys.exit(0)
    if args.enable:
        for action_id in action_id_list:
            switch_zabbix_action(auth_code, action_id, '0')
        sys.exit(0)

使用方式:

在自行替换上述脚本中的zabbix server的ip和账号密码后执行下述命令:

# 禁用
$ python xxx.py -D

# 启用
$ python xxx.py -E