#!/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"
},
······
]
