原文地址:https://www.jianshu.com/p/d5faa110e78e
zabbix 接口地址:https://www.zabbix.com/documentation/3.2/manual/api/reference/maintenance/object
zabbix 優勢在於其豐富的api功能,可以高度定制化、擴展。筆者也是在使用了1年的API中收獲頗豐。在cmdb資產管理功能、微信操作控制zabbix功能、獲取zabbix數據制作報表等都利用到了zabbix api。
筆者把腳本腳本分為三個部分
- 1.登陸腳本 login.py
- 2.定義函數腳本 function.py
- 3.調用執行腳本 zabbix.py
登陸腳本 login.py
#!/usr/bin/env python import urllib2 import json #定義URL賬戶密碼 url = 'http://zabbixip/zabbix/api_jsonrpc.php' username = 'admin' password = 'password' #定義通過HTTP方式訪問API地址的函數,后面每次請求API的各個方法都會調用這個函數 def requestJson(url,values): data = json.dumps(values) req = urllib2.Request(url, data, {'Content-Type': 'application/json-rpc'}) response = urllib2.urlopen(req, data) output = json.loads(response.read()) # print output try: message = output['result'] except: message = output['error']['data'] print message quit() return output['result'] #API接口認證的函數,登錄成功會返回一個Token def authenticate(url, username, password): values = {'jsonrpc': '2.0', 'method': 'user.login', 'params': { 'user': username, 'password': password }, 'id': '0' } idvalue = requestJson(url,values) return idvalue
定義函數腳本 function.py
(這里只是部分函數供參考更多查看官方文檔)
#!/usr/bin/env python #coding=utf-8 import sys import argparse import urllib2 import json #定義更新action函數 def mediatypeupdate(mediatypeid,status,auth): values = {'jsonrpc': '2.0', 'method': 'mediatype.update', 'params': { "mediatypeid": mediatypeid, "status": status }, 'auth': auth, 'id': '1' } output = requestJson(url,values) #定義讀取狀態函數 def triggerget(auth): values = {'jsonrpc': '2.0', "method":"trigger.get", "params": { "output": [ "triggerid", "description", "priority" ], "filter": { "value": 1 }, "expandData":"hostname", "sortfield": "priority", "sortorder": "DESC" }, 'auth': auth, 'id': '2' } output = requestJson(url,values) return output #定義通過ip獲取主機id的函數 def ipgetHostsid(ip,url,auth): values = {'jsonrpc': '2.0', 'method': 'host.get', 'params': { 'output': [ "host" ], 'filter': { 'ip': ip }, }, 'auth': auth, 'id': '3' } output = requestJson(url,values) return output #定義通過主機id獲取開啟關閉監控函數 def idupdatehost(status,hostid,url,auth): values = {'jsonrpc': '2.0', 'method': 'host.update', 'params': { "hostid": hostid, "status": status }, 'auth': auth, 'id': '4' } output = requestJson(url,values) return output #定義通過項目hostid獲取itemid函數 def getHostsitemsid(hostid,itemsname,url,auth): values = {'jsonrpc': '2.0', 'method': "item.get", "params": { "output": ["itemids"], "hostids": hostid, "filter":{ "key_": itemsname, }, }, 'auth': auth, 'id': '5' } output = requestJson(url,values) if len(output)==0: return output else: return output[0]['itemid'] #定義通過項目id獲取監控項目最近值信息的函數 def getHostsitemsvalue(itemid,url,auth): values = {'jsonrpc': '2.0', 'method': "history.get", "params": { "output": "extend", "history":3, "itemids":itemid, "sortfield": "clock", "sortorder": "DESC", "limit":1, }, 'auth': auth, 'id': '6' } output = requestJson(url,values) if len(output)==0: return output else: return output[0]["value"] #定義更新讀取狀態action函數 def mediatypeget(mediatypeid,auth): values = {'jsonrpc': '2.0', 'method': 'mediatype.get', 'params': { "output": "extend", "filter": { "mediatypeid":mediatypeid, }, }, 'auth': auth, 'id': '7' } output = requestJson(url,values) if len(output)==0: return output else: return output[0]['status'] #定義maintenance維修模式host函數 def maintenancecreate(maintenancename,active_since,active_till,hostid,auth): values = {'jsonrpc': '2.0', 'method': 'maintenance.create', 'params': { "name": maintenancename, "active_since": active_since, "active_till": active_till, "hostids": [ hostid ], "timeperiods": [ { "timeperiod_type": 0, "every": 1, "dayofweek": 64, "start_time": 64800, "period": 3600 } ] }, 'auth': auth, 'id': '8' } output = requestJson(url,values) #定義通過模糊獲取關閉主機信息函數 def disabledhostget(url,auth): values = {'jsonrpc': '2.0', 'method': 'host.get', "params": { "output": ["host"], 'selectInterfaces': [ "ip" ], "filter": { "status":1 } }, 'auth': auth, 'id': '9' } output = requestJson(url,values) return output #定義maintenance維修模式group函數 def maintenancecreategroup(maintenancename,active_since,active_till,groupid,auth): values = {'jsonrpc': '2.0', 'method': 'maintenance.create', 'params': { "name": maintenancename, "active_since": active_since, "active_till": active_till, "groupids": [ groupid ], "timeperiods": [ { "timeperiod_type": 0, "every": 1, "dayofweek": 64, "start_time": 64800, "period": 3600 } ] }, 'auth': auth, 'id': '10' } output = requestJson(url,values) #定義通過host groups named 獲取groupid def groupnameGroupid(groupname,auth): values = {'jsonrpc': '2.0', 'method': 'hostgroup.get', "params": { "output": "extend", "filter": { "name": [ groupname ] } }, 'auth': auth, 'id': '11' } output = requestJson(url,values) return output #定義模糊查詢維護主機 def maintenanceget(url,auth): values = {'jsonrpc': '2.0', 'method': 'maintenance.get', "params": { "output": "extend", }, 'auth': auth, 'id': '12' } output = requestJson(url,values) return output #定義批量恢復處於維護主機 def maintenancedelete(maintenanceid,url,auth): values = {'jsonrpc': '2.0', 'method': 'maintenance.delete', "params": [ maintenanceid ], 'auth': auth, 'id': '13' } output = requestJson(url,values) return output #定義通過hostid獲取graphid的函數 def getgraphid(hostid,graphname,url,auth): values = {'jsonrpc': '2.0', 'method': 'graph.get', 'params': { "output": "name", "hostids": hostid, "sortfield": "name", 'filter': { "name": graphname }, }, 'auth': auth, 'id': '14' } output = requestJson(url,values) return output
調用執行腳本 zabbix.py
1. 關閉、啟用主機監控(poweronoff.py)
#!/usr/bin/env python #coding=utf-8 import urllib2 import sys import json import argparse from login import * from function import * #登陸zabbix獲取auth auth = authenticate(url, username, password) #狀態0是啟用監控,1是禁用監控 status=1 #定義操作ip hostip='192.168.1.100' #通過hostip獲取zabbix hostid hostids=ipgetHostsid(hostip,url,auth) hostid=hostids[0]['hostid'] #通過主機id開啟關閉監控 idupdatehost(status,hostid,url,auth)
2. 添加維護周期(maintenance.py)
#!/usr/bin/env python #coding=utf-8 import urllib2 import sys import json import argparse import time from login import * from function import * def timetostamp(strtime): timeArrary = time.strptime(strtime, "%Y-%m-%d %H:%M") return int(time.mktime(timeArrary)) ''' if __name__ == '__main__': __name__ 是當前模塊名,當模塊被直接運行時模塊名為 __main__ 。 這句話的意思就是,當模塊被直接運行時,以下代碼塊將被運行,當模塊是被導入時,代碼塊不被運行。 在你import別的py文件時,那個py文件會被存一份pyc加速下次裝載。而主文件因為只需要裝載一次就沒有存pyc ''' #登陸zabbix獲取auth auth = authenticate(url, username, password) hostip='10.10.10.10' groupname='Zabbix Agent' #通過hostip獲取zabbix hostid hostids=ipgetHostsid(hostip,url,auth) hostid=hostids[0]['hostid'] #通過groupname獲取zabbix groupid groupids=groupnameGroupid(groupname,auth) groupid=groupids[0]['groupid'] # 名稱,描述,注意name不能重復 name='Zabbix Agent group更新維護' desc = "這是一次全服更新維護,請悉知!" # 維護時間 dt_since = '2018-01-18 11:25' dt_till = '2018-01-18 13:25' active_since = timetostamp(dt_since) active_till = timetostamp(dt_till) # 開始生效時間 dt_start = '2018-01-18 12:30' start_date = timetostamp(dt_start) # 持續時間,單位秒 period = 600 print 'period=%ds' % period if __name__ == '__main__': maintenancecreate(name,active_since,active_till,desc,hostid,start_date,period,auth) maintenancecreategroup(name,active_since,active_till,desc,groupid,start_date,period,auth)
