Zabbix Web API Get方法整合


#!/usr/bin/python3

import  requests,json,re,time,datetime
 
 
url  =  'http://xxx.com/api_jsonrpc.php'
headers  =  { "Content-Type" : "application/json" 'User-Agent' 'Godaner.com python-requests' #設置請求頭
username  =  'username'      #用戶名
password  =  'passwd'         #密碼
 
def  get_token():             #獲取認證token,token有效時間為zabbix用戶配置的自動退出時間
     data  =  {
         "jsonrpc" "2.0" ,
         "method" "user.login" ,
         "params" : {
             "user" : username,
             "password" : password
         },
         "id" 0
     }
     try :
         resp  =  requests.post(url = url, headers = headers, data = json.dumps(data))
         token  =  json.loads(resp.text)[ 'result' ]
         #resp.close()
     except :
         return  'F'
     return  token
#示例獲取token 
token  =  get_token()
print (token)
f24008481e287qc1e931e6598c041od6
 
 
def  get_host(token,ip2host = ""):
     if  ip2host:
         selectItems  =  "selectItems"
         selectTriggers  =  "selectTriggers"
     else :
         selectItems  =  ""
         selectTriggers  =  ""
     if  re.search( '[a-z]' , ip2host):
         arg  =  'host'
     else :
         arg  =  'ip'
     #獲取單個或者所有zabbix主機信息,ip2host(IP,主機名)為空獲取所有主機信息
     #獲取所有主機的時候將不輸出對應主機的監控項和觸發器信息。(大量主機)
     data  =  {
         "jsonrpc" "2.0" ,
         "method" "host.get" ,
         "params" : {
             "output" : [ "hostid" , "name" , "status" , "available" ],
             #返回: [主機id,主機名,主機狀態(0監控中|1未監控),主機的可用性(0可用|1不可用)]
             selectItems: [ "itemid" , "key_" , "name" , "value_type" , "status" , "lastclock" , "lastvalue" ],
             #返回此主機的監控項信息:[id,key,名稱,數據類型,可用性(0 啟用|1 禁用),上次取值時間,最后一次的值]
             #特別注意value_type,這個參數是創建監控項時,選擇的返回值數據類型。當獲取不到item值的時候,要注意此值:
             #0 浮點數;1 字符串;2 日志;3 整數 默認值;4 文本長字符串
             selectTriggers: [ "expression" , "priority" , "status" , "value" ],
             #返回此主機的觸發器信息:[觸發器表達式,嚴重級別(0-5),可用性(0 啟用|1 禁用),觸發器狀態(0 正常|1 問題)]
             "selectGroups" : [ "groupid" , "name" ],
             #返回此主機所在組:[組id,組名]
             "selectInterfaces" : [ "interfaceid" , "ip" , "port" ],
             #返回此主機連接信息:[網卡id,ip地址,端口]
             "selectParentTemplates" : [ "templateid" , "name" ],
             #返回此主機連接的模板信息:[模板id,模板名]
             "filter" : {
                 arg: ip2host,
             },
             #過濾,這個跟上面的邏輯對應,這里過濾ip或者主機名,只在ip2host參數有值時生效
         },
     "id" 0 ,
     "auth" : token,
     }
     resp  =  requests.post(url = url, headers = headers, data = json.dumps(data))
     return  json.loads(resp.text)[ 'result' ]
#示例 獲取所有主機和單個主機,單個主機的時候返回監控項和觸發器信息
hosts  =  get_host(token)     #獲取所有主機信息
print (json.dumps(hosts, indent = 4 , ensure_ascii = False ))
[    
     {
         "status" "0" ,
         "name" "xxxxxxxxxx" ,
         "hostid" "14700"
         "available" "1" ,
         "parentTemplates" : [
             {
                 "templateid" "12601" ,
                 "name" "Agent_SH"
             },
             {
                 "templateid" "13025" ,
                 "name" "Template_Apps"
             }
         ],
         "interfaces" : [
             {
                 "interfaceid" "4771" ,
                 "ip" "xx.xx.xx.xx" ,
                 "port" "10050"
             }
         ],
         "groups" : [
             {
                 "name" "Discovered hosts" ,
                 "groupid" "5"
             },
             {
                 "name" "OS_CentOS" ,
                 "groupid" "15"
             }
         ],
     },
     {
         "status" "0" ,
         "name" "xxxxxxxxxx" ,
         "hostid" "14701"
         "available" "1" ,
         "parentTemplates" : [
             {
                 "templateid" "12601" ,
                 "name" "Agent_SH"
             },
             {
                 "templateid" "13025" ,
                 "name" "Template_Apps"
             }
         ],
         "interfaces" : [
             {
                 "interfaceid" "4834" ,
                 "ip" "xx.xx.xx.xx" ,
                 "port" "10050"
             }
         ],
         "groups" : [
             {
                 "name" "Discovered hosts" ,
                 "groupid" "5"
             },
             {
                 "name" "OS_CentOS" ,
                 "groupid" "15"
             }
         ],
     },   
     ······
]
host  =  get_host(token,ip2host = 'x.x.x.x' )     #獲取單個主機信息,帶項目和觸發器信息
print (json.dumps(host, indent = 4 , ensure_ascii = False ))
[
     {
         "interfaces" : [
             {
                 "ip" "x.x.x.x" ,
                 "interfaceid" "1" ,
                 "port" "10050"
             }
         ],
         "name" "Godaner" ,
         "items" : [
             {
                 "name" "check iptables" ,
                 "lastvalue" "it's ok" ,
                 "key_" "fwcheck" ,
                 "value_type" "4" ,
                 "itemid" "23833" ,
                 "lastclock" "1554515244" ,
                 "status" "0"
             },
             {
                 "name" "login" ,
                 "lastvalue" "Apr 5 16:43:37 Godaner sshd[24987]: Accepted password for ····" ,
                 "key_" "log[/var/log/secure,\"Accepted password\",,,skip,]" ,
                 "value_type" "2" ,
                 "itemid" "23767" ,
                 "lastclock" "1554453825" ,
                 "status" "0"
             },          
             ······
         ],
         "triggers" : [
             {
                 "value" "0" ,
                 "status" "0" ,
                 "priority" "5" ,
                 "expression" "{13220}=0 and {13221}=0" ,
                 "triggerid" "13614"
             },
             {
                 "value" "0" ,
                 "status" "0" ,
                 "priority" "4" ,
                 "expression" "{13299}>1" ,
                 "triggerid" "13616"
             },           
             ······
         ],
         "hostid" "10084" ,
         "groups" : [
             {
                 "name" "testgroup" ,
                 "groupid" "4"
             }
         ],
         "available" "1" ,
         "status" "0"
     }
]
 
 
def  get_trigger_bad(token,hostid = ""): 
     if  not  hostid:
         arg  =  ""
     else :
         arg  =  "hostids"
     #獲取問題觸發器,hostid為空時,獲取所有問題觸發器
     data  =  {
         "jsonrpc" "2.0" ,
         "method" "trigger.get" ,
         "params" : {
             arg: hostid,
             "only_true" 1 ,          #只返回最近處於問題狀態的觸發器
             "active" 1 ,             #只返回啟用的觸發器
             #"skipDependent":1,     #在依賴於其他觸發器的問題狀態中跳過觸發器
             "monitored" : 1 ,           #只返回所屬被監控主機啟用觸發器,且包含已啟用的監控項(跳過監控項不可用的問題觸發器)
             "output" : [ "priority" , "status" , "value" , "description" ],
             #輸出: [嚴重級別|(啟用|禁用)|(正常|問題)|觸發器名稱]
             "selectHosts" : [ "name" ], #返回host,id
             #"selectItems": ["name"],#返回item,id
             "sortfield" "priority" , #以嚴重級別排序
             "sortorder" "DESC" ,     #降序 
             "filter" : {
                "value" 1 ,          #過濾問題觸發器
             }
         },
     "id" 0 ,
     "auth" : token,
     }
     resp  =  requests.post(url = url, headers = headers, data = json.dumps(data))
     return  json.loads(resp.text)[ 'result' ]
#示例 獲取當前所有問題觸發器
trigger_bad  =  get_trigger_bad(token)
print (json.dumps(trigger_bad, indent = 4 , ensure_ascii = False ))
[
     {
         "description" "Filesystems: 可用磁盤空間少於 5% --> /usr" ,
         "hosts" : [
             {
                 "hostid" "13382" ,
                 "name" "x.x.x.x"
             }
         ],
         "priority" "2" ,
         "value" "1" ,
         "triggerid" "77341" ,
         "status" "0"
     },
     {
         "description" "zombie on {HOST.NAME}" ,
         "hosts" : [
             {
                 "hostid" "11820" ,
                 "name" "x.x.x.x"
             }
         ],
         "priority" "1" ,
         "value" "1" ,
         "triggerid" "63834" ,
         "status" "0"
     },    
     ······    
]
 
 
def  get_groups(token):   #獲取所有組信息,輸出組id,組名
     data  =  {
         "jsonrpc" "2.0" ,
         "method" "hostgroup.get" ,
         "params" : {
            "output" : [ "groupid" , "name" ],
         },
         "auth" : token,
         "id" 0 ,
     }
     resp  =  requests.post(url = url, headers = headers, data = json.dumps(data))
     return  json.loads(resp.text)[ 'result' ]
#示例 獲取所有組
groups  =  get_groups(token)
print (json.dumps(groups, indent = 4 , ensure_ascii = False ))
[
     {
         "name" "SH" ,
         "groupid" "49"
     },
     {
         "name" "HK" ,
         "groupid" "4"
     },
     ······
]
 
 
def  get_group_hosts(token, groupid):     #獲取指定組id里的所有主機,輸出主機名跟id
     data  =  {
         "jsonrpc" "2.0" ,
         "method" "host.get"
         "params" : {
             "groupids" : groupid,
             "output" : [ "host" , "hostid" ],
         },
         "auth" : token,
         "id" 0 ,
     }
     resp  =  requests.post(url = url, headers = headers, data = json.dumps(data))
     return  json.loads(resp.text)[ 'result' ]
#示例 獲取指定組里所有主機
hosts  =  get_group_hosts(token,groupid = 'xxx' )
print (json.dumps(hosts, indent = 4 , ensure_ascii = False ))
[
     {
         "host" "web.zabbix" ,
         "hostid" "13247"
     },
     {
         "host" "db.zabbix" ,
         "hostid" "14045"
     },
     ······
]
 
 
def  get_items(token, hostid, key = ""):  #獲取指定主機所有監控項,也可指定key名稱獲取。 
     if  re.search( '[a-z]' , key):
         arg  =  "key_"
     else :
         arg  =  "itemid"
     data  =  {
         'jsonrpc' '2.0' ,
         'method' "item.get" ,
         "params" : {
             "output" : [ "itemid" , "key_" , "name" , "value_type" , "status" , "lastclock" , "lastvalue" ],
             #輸出信息跟上面的get_host里的selectItems一樣
             "hostids" : hostid,
             "filter" :{
                 arg: key,
             },
         },
         'auth' : token,
         'id' 0 ,
     }
     resp  =  requests.post(url = url, headers = headers, data = json.dumps(data))
     return  json.loads(resp.text)[ 'result' ]
#示例 獲取單個主機所有監控項
itemids  =  get_items(token,hostid = 'xxxx' )
print (json.dumps(itemids, indent = 4 , ensure_ascii = False ))
[
     {
         "lastclock" "1554514630" ,
         "value_type" "3" ,
         "key_" "vm.memory.size[total]" ,
         "name" "Total memory" ,
         "itemid" "23830" ,
         "lastvalue" "17180569600" ,
         "status" "0"
     },
     {
         "lastclock" "1554517503" ,
         "value_type" "3" ,
         "key_" "webcheck" ,
         "name" "check www.godaner.com" ,
         "itemid" "23832" ,
         "lastvalue" "200" ,
         "status" "0"
     },
     ······
]
 
 
def  get_history(token, itemid, limit = "10" , stime = " ", etime=" ", vtp=" 3 "):
     #get_history(token=get_token(),itemid='23809')返回指定監控項23809最近10條數據
     #如果沒有值,注意vtp,默認是整數型的,比如要取cpu load的值,就要用vtp=0
     if  not  etime:
         etime  =  time.time()
     #不指定結束時間,結束之間為當前時間,也可指定時間段查詢,單位為時間戳
     data  =  {
         "jsonrpc" "2.0" ,
         "method" "history.get" ,
         "params" : {
             "output" "extend" ,      #輸出所有
             "history" : vtp,          #值存儲的數據類型
             "itemids" : itemid,       #itemid
             "sortfield" "clock" ,    #以時間排序
             "sortorder" "DESC" ,     #倒序
             "limit" : limit,          #返回數據的條數
             "time_from" : stime,      #返回在給定時間時或之后收到的值
             "time_till" : etime,      #返回在給定時間時或之前收到的值
         },
         "auth" : token,
         "id" 0 ,
     }
     resp  =  requests.post(url = url, headers = headers, data = json.dumps(data))
     return  json.loads(resp.text)[ 'result' ]
#示例 獲取單個item最近10次的歷史記錄,也可指定某個時間段,此例為默認
history  =  get_history(token,itemid = '23832' )
print (json.dumps(history, indent = 4 , ensure_ascii = False ))
[
     {
         "itemid" "23832" ,
         "ns" "670291350" ,
         "clock" "1554516780" ,
         "value" "200"
     },
     {
         "itemid" "23832" ,
         "ns" "41115479" ,
         "clock" "1554516660" ,
         "value" "502"
     },
     ······
]
 
 
def  get_events(token,tfrom):
     #某個時間之后,由問題觸發器產生的事件
     data  =  {
         "jsonrpc" "2.0" ,
         "method" "event.get" ,
         "params" : {
             "output" : [ "eventid" , "clock" , "value" ],
             #返回:[事件id,事件,
             #"value這個值是相關對象狀態,這個值可能來自於觸發器,可能是自動發現,還有可能是內部事件,記住1是問題就行"]
             #"time_from": time.mktime((datetime.datetime.now() - datetime.timedelta(days=1)).timetuple()),
             "time_from" : tfrom,          #返回這個時間戳之后的事件
             "selectHosts" : [ "name" ],     #返回這個事件是哪個主機產生的
             "selectRelatedObject" : [ "triggerid" , "description" ],
             #返回這個事件是哪個對象產生的,如果是觸發器的話返回[觸發器id,觸發器名稱]
             "sortfield" : [ "clock" ],      #以時間排序
             "sortorder" "desc" ,         #倒序
             "filter" : {                  #過濾
                 "source" "0" ,           #0 觸發器,1 自動發現,2 自動注冊,3內部事件
                 "object" "0" ,           #0,1,2,3 同上,0就是觸發器事件
                 "value" "1" ,            #0 正常事件,1 故障事件
             }
         },
     "auth" : token,
     "id" 0 ,
     }
     resp  =  requests.post(url = url, headers = headers, data = json.dumps(data))
     return  json.loads(resp.text)[ 'result' ]
#示例 獲取某個時間之后,所有由問題觸發器產生的事件
events  =  get_events(token,tfrom = '1554315660' )
print (json.dumps(events, indent = 4 , ensure_ascii = False ))
[
     {
         "eventid" "10375" ,
         "hosts" : [
             {
                 "name" "Godaner" ,
                 "hostid" "10084"
             }
         ],
         "clock" "1554374074" ,
         "relatedObject" : {
             "triggerid" "13654" ,
             "description" "check www.godaner.com"
         },
         "value" "1"
     },
     {
         "eventid" "10376" ,
         "hosts" : [
             {
                 "name" "Godaner" ,
                 "hostid" "10084"
             }
         ],
         "clock" "1554374194" ,
         "relatedObject" : {
             "triggerid" "13654" ,
             "description" "check www.godaner.com"
         },
         "value" "1"
     },
     ······
]
 
 
def  get_alerts(token,tfrom):
     #獲取報警信息
     data  =  {
         "jsonrpc" "2.0" ,
         "method" "alert.get" ,
         "params" : {
             "output" : [ "eventid" , "subject" , "clock" , "esc_step" ],
             #輸出:[事件id,報警主題,報警時間,
             #警次次數,這個報警次數是針對單事件的,多事件報警這個值永遠為1。多事件就是在創建觸發器那里有個多事件選擇
             #這個值就可以很好的判斷 這個報警持續了多久 重要哦]
             "time_from" : tfrom,
             #返回這個時間戳之后的報警,上面這個是1天(24小時)前的時間戳
             "selectHosts" : [ "name" ],     #返回報警主機的主機名
             "sortfield" : [ "clock" ],      #以時間排序
             "sortorder" "desc" ,         #倒序
         },
         "auth" : token,
         "id" 0 ,
     }
     resp  =  requests.post(url = url, headers = headers, data = json.dumps(data))
     return  json.loads(resp.text)[ 'result' ]
#示例 獲取24小時內報警信息
tt  =  time.mktime((datetime.datetime.now()  -  datetime.timedelta(days = 3 )).timetuple())
alerts  =  get_alerts(token,tfrom = tt)
print (json.dumps(alerts, indent = 4 , ensure_ascii = False ))
[
     {
         "clock" "1554374317" ,
         "esc_step" "3" ,
         "subject" "Godaner: check www.godaner.com" ,
         "hosts" : [
             {
                 "hostid" "10084" ,
                 "name" "Godaner"
             }
         ],
         "eventid" "10376" ,
         "alertid" "10129"
     },
     {
         "clock" "1554374317" ,
         "esc_step" "3" ,
         "subject" "Godaner: check www.godaner.com" ,
         "hosts" : [
             {
                 "hostid" "10084" ,
                 "name" "Godaner"
             }
         ],
         "eventid" "10376" ,
         "alertid" "10130"
     },
     ······
]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM