Zabbix 4.2 使用(五)zabbix4.2 通过API 开启维护模式

目录

1. 版本说明

2. 使用场景

3. 脚本内容


 

1. 版本说明

软件版本
python3.7
zabbix4.2

2. 使用场景

    在生产环境中,每次上线都会发出大量告警,为应对此类告警,可以在zabbix配置维护模式

    每次配置维护模式,都较为麻烦,所以公司要求jenkins联合zabbix进行发布自动维护

3. 脚本内容

脚本名称:zabbix_weihu.py

参数说明:python zabbix_weihu.py 要维护的主机组名 维护时间(单位分钟)

例如:python zabbix_weihu.py mysql 5

注:zabbix 4.2 主机和主机组API 有BUG,在进行token认证的时候,将id和token取反了,需要注意,截止 2020/07/25日未修复

#!/usr/bin/python3
import requests
import sys


def auth(uid, username, password, api_url):
    """
    zabbix认证
    :param uid:
    :param username:
    :param password:
    :return:
    """
    data = {
        "jsonrpc": "2.0",
        "method": "user.login",
        "params": {
            "user": username,
            "password": password
        },
        "id": uid
    }

    res = requests.post(api_url, json=data) # post json到接口
    result = res.json()
    return result # 返回信息


def get_maintenance(uid, auth_code, api_url):
    """
    get maintenance
    :return:
    """
    data = {
        "jsonrpc": "2.0",
        "method": "maintenance.get",
        "params": {
            "output": "extend",
            "selectGroups": "extend",
            "selectTimeperiods": "extend",
            "selectTags": "extend"
        },
        "auth": auth_code,
        "id": uid
    }
    res = requests.post(api_url, json=data) # post json到接口
    result = res.json()
    return result # 返回信息


def delete_maintenance(uid, auth_code, maintenance_id):
    """
    delete maintenance
    :return:
    """
    data = {
        "jsonrpc": "2.0",
        "method": "maintenance.delete",
        "params": [
            maintenance_id
        ],
        "auth": auth_code,
        "id": uid
    }
    res = requests.post(api_url, json=data) # post json到接口
    result = res.json()
    return result # 返回信息


def create_maintenance(uid, auth_code, period, gid, group_name, api_url):
    """
    get maintenance
    :return:
    """

    data = {
        "jsonrpc": "2.0",
        "method": "maintenance.create",
        "params": {
            "name": group_name, # 维护任务名字,这里用主机组名
            "active_since": 1591563600, # 维护任务活动时间时间,时间戳 2020/6/8 5:0:0
            "active_till": 2145891660, # 维护任务过期时间,2038-01-01 1:1
            "tags_evaltype": 0,
            "maintenance_type": 0, # 0 正常收集数据但是不告警,1 不收集数据
            "groupids": [
                gid
            ],
            "timeperiods": [
                {
                    "timeperiod_type": 0, # 维护执行类型 0 代表仅一次
                    "every": 1,
                    "dayofweek": 0,
                    "start_time": 43200, # 字段意义不明,官方说每天的第N秒,但是验证不是
                    "period": period # 持续时间,单位秒
                    # "start_date":1591609320# 开始维护时间,时间戳,默认为创建时间
                }
            ],
            "tags": []
        },
        "auth": auth_code,
        "id": uid
    }
    res = requests.post(api_url, json=data) # post json到接口
    result = res.json()
    # print(result)
    return result # 返回信息


def get_groupid(group_name, auth_code, uid, api_url):
    """
    use hostname get hostid
    :param hostname:
    :param auth:
    :param uid:
    :return:
    """
    # hostid and gid : h_g_ids=[{hostid:gid},...]
    data = {
        "jsonrpc": "2.0",
        "method": "hostgroup.get",
        "params": {
            "output": "extend",
            "filter": {
                "name": [
                    group_name
                ]
            }
        },
        # "auth": auth_code, #此处有BUG,Host group API , Host API 中 auth 字段和 id 字段取反了
        # "id": uid #此处有BUG,Host group API , Host API 中 auth 字段和 id 字段取反了
        "auth": uid, # 此处有BUG,Host group API , Host API 中 auth 字段和 id 字段取反了
        "id": auth_code # 此处有BUG,Host group API , Host API 中 auth 字段和 id 字段取反了
    }
    res = requests.post(api_url, json=data) # post json到接口
    result = res.json()
    # print(result)
    return result # 返回信息group id


def logout(uid, auth_code, api_url):
    """
    退出
    :param uid:
    :param auth_code:
    :return:
    """
    data = {
        "jsonrpc": "2.0",
        "method": "user.logout",
        "params": [],
        "id": uid,
        "auth": auth_code
    }

    res = requests.post(api_url, json=data) # post json到接口
    result = res.json()
    try:
        if result["result"]:
            print("---------logout success !----------")
    except Exception as e:
        print("---------logout error !----------")
        print(e)
    return result # 返回信息


if __name__ == '__main__':

    # user info
    uid = 1 # 用户ID
    username = 'Admin'
    password = 'zabbix'
    api_url = "http://172.16.0.3/zabbix/api_jsonrpc.php"
    group_name = sys.argv[1]
    # group_name = "MR_APP"
    period = int(sys.argv[2]) * 60
    # period = 3600

    # login
    print("---------login----------")
    res = auth(uid, username, password, api_url) # 认证
    try:
        if res['result']:
            print("---------login success ----------")
            auth_code = res['result'] # 认证串 token
    except Exception as e:
        print("---------login error! ----------")
        print(res)
        sys.exit()

    # get_groupid
    print("---------get_groupid----------")
    gid_res = get_groupid(group_name, uid, auth_code, api_url)
    try:
        gid = gid_res["result"][0]["groupid"]
    except Exception as e:
        print("---------get_groupid error !----------")
        sys.exit()
    else:
        print("---------get_groupid success: gid :" + gid + " ----------")
    # get_maintenance
    print("---------get_maintenance----------")
    res = get_maintenance(uid, auth_code, api_url)
    print("---------get_maintenance success !----------")
    try:
        for i in res["result"]:
            for j in i["groups"]:
                if j["groupid"] == gid and i["name"] == group_name:
                    # if have maintenance,delete
                    print("---------delete_old_maintenance----------")
                    res = delete_maintenance(uid, auth_code, i["maintenanceid"])
                    print("---------delete_old_maintenance success ----------")
    except Exception as e:
        pass

    # create_maintenance
    print("---------create_maintenance----------")
    res = create_maintenance(uid, auth_code, period, gid, group_name, api_url)
    print("---------create_maintenance success !----------")
    print("---------logout----------")
    # logout
    logout(uid, auth_code, api_url) # 退出登录

如果觉得有用,请点个赞!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值