目录
1. 版本说明
软件 | 版本 |
python | 3.7 |
zabbix | 4.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) # 退出登录
如果觉得有用,请点个赞!