近日公司准备自已做一个运维管理平台,其中的监控部分,打算调用zabbix api接口来进行展示。
经过思考之后,计划获取如下内容:
1、 获得认证密钥
2、 获取zabbix所有的主机组
3、 获取单个组下的所有主机
4、 获取某个主机下的所有监控项
5、 获取某个监控项的历史数据
6、 获取某个监控项的最新数据
计划最后展示框架如下内容(这只是值方面,其它的会再加):
主机组1 ----主机名1---监控项1----当前值
---监控项2----当前值
----主机名2----监控项1----当前值
----监控项2----当前值
主机组2 ----主机名3---监控项1----当前值
---监控项2----当前值
----主机名4----监控项1----当前值
----监控项2----当前值
进入正题
1. user.login方法获取zabbix server的认证结果
官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/user/login
python脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
[root@yang python] # cat auth.py
#!/usr/bin/env python2.7 #coding=utf-8 import json
import urllib2
# based url and required header url = "http://1.1.1.1/zabbix/api_jsonrpc.php"
header = { "Content-Type" : "application/json" }
# auth user and password data = json.dumps(
{ "jsonrpc" : "2.0" ,
"method" : "user.login" ,
"params" : {
"user" : "Admin" ,
"password" : "zabbix"
}, "id" : 0
}) # create request object request = urllib2.Request(url,data)
for key in header:
request.add_header(key,header[key])
# auth and get authid try :
result = urllib2.urlopen(request)
except URLError as e:
print "Auth Failed, Please Check Your Name AndPassword:" ,e.code
else :
response = json.loads(result.read())
result.close()
print "Auth Successful. The Auth ID Is:" ,response[ 'result' ]
|
python脚本运行结果:
1
2
|
[root@yang python] # python auth.py
Auth Successful. The Auth ID Is: a0b82aae0842c2041386a61945af1180
|
curl命令:
1
2
3
|
curl - i - X POST - H 'Content-Type:application/json' - d '{ "jsonrpc" :
"2.0" , "method" : "user.login" , "params" :{ "user" : "admin" , "password" : "zabbix" }, "auth" :
null, "id" : 0 }' http: / / 1.1 . 1.1 / zabbix / api_jsonrpc.php
|
curl命令运行结果:
1
|
{ "jsonrpc" : "2.0" , "result" : "b895ce91ba84fe247e444817c6773cc3" , "id" : 0 }
|
2. hostgroup.get方法获取所有主机组ID
把认证密钥放到脚本中,每次获取数据时都需要认证。此处是获取zabbix server上的所有主机组名称与ID号。
官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/hostgroup/get
python脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
[root@yang python] # catget_hostgroup_list.py
#!/usr/bin/env python2.7 #coding=utf-8 import json
import urllib2
# based url and required header url = "http://1.1.1.1/zabbix/api_jsonrpc.php"
header = { "Content-Type" : "application/json" }
# request json data = json.dumps(
{ "jsonrpc" : "2.0" ,
"method" : "hostgroup.get" ,
"params" :{
"output" :[ "groupid" , "name" ],
},
"auth" : "3c0e88885a8cf8af9502b5c850b992bd" , # theauth id is what auth script returns, remeber it is string
"id" : 1 ,
}) # create request object request = urllib2.Request(url,data)
for key in header:
request.add_header(key,header[key])
# get host list try :
result = urllib2.urlopen(request)
except URLError as e:
if hasattr (e, 'reason' ):
print 'We failed to reach a server.'
print 'Reason: ' , e.reason
elif hasattr (e, 'code' ):
print 'The server could not fulfill the request.'
print 'Error code: ' , e.code
else :
response = json.loads(result.read())
result.close()
print "Number Of Hosts: " , len (response[ 'result' ])
#print response
for group in response[ 'result' ]:
print "Group ID:" ,group[ 'groupid' ], "\tGroupName:" ,group[ 'name' ]
|
python脚本执行结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[root@yang python] # pythonget_hostgroup_list.py
Number Of Hosts: 12
Group ID : 11 Group Name: DB Schedule
Group ID : 14 Group Name: DG - WY - KD - Server
Group ID : 5 Group Name: Discovered hosts
Group ID : 7 Group Name: Hypervisors
Group ID : 2 Group Name: Linux servers
Group ID : 8 Group Name: monitored_linux
Group ID : 9 Group Name: qsmind
Group ID : 12 Group Name: qssec
Group ID : 13 Group Name: switch
Group ID : 1 Group Name: Templates
Group ID : 6 Group Name: Virtual machines
Group ID : 4 Group Name: Zabbix servers
|
curl命令:
1
|
curl - i - X POST - H 'Content-Type:application/json' - d '{"jsonrpc": "2.0","method":"hostgroup.get","params":{"output":["groupid","name"]},"auth":"11d2b45415d5de6770ce196879dbfcf1","id": 0}' http: / / 1.1 . 1.1 / zabbix / api_jsonrpc.php
|
curl执行结果:
1
|
{ "jsonrpc" : "2.0" , "result" :[{ "groupid" : "11" , "name" : "DBSchedule" },{ "groupid" : "14" , "name" : "DG-WY-KD-Server" },{ "groupid" : "5" , "name" : "Discoveredhosts" },{ "groupid" : "7" , "name" : "Hypervisors" },{ "groupid" : "2" , "name" : "Linuxservers" },{ "groupid" : "8" , "name" : "monitored_linux" },{ "groupid" : "9" , "name" : "qsmind" },{ "groupid" : "12" , "name" : "qssec" },{ "groupid" : "13" , "name" : "switch" },{ "groupid" : "1" , "name" : "Templates" },{ "groupid" : "6" , "name" : "Virtualmachines" },{ "groupid" : "4" , "name" : "Zabbixservers" }], "id" : 0 }
|
3. host.get方法获取单个主机组下所有的主机ID。
根据标题2中获取到的主机组id,把主机组id填入到下边脚本中,就可以获得该主机组下所有的主机id。
官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/host/get
python脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
[root@yang python] # cat get_group_one.py
#!/usr/bin/env python2.7 #coding=utf-8 import json
import urllib2
# based url and required header url = "http://1.1.1.1/zabbix/api_jsonrpc.php"
header = { "Content-Type" : "application/json" }
# request json data = json.dumps(
{ "jsonrpc" : "2.0" ,
"method" : "host.get" ,
"params" :{
"output" :[ "hostid" , "name" ],
"groupids" : "14" ,
},
"auth" : "3c0e88885a8cf8af9502b5c850b992bd" , # theauth id is what auth script returns, remeber it is string
"id" : 1 ,
}) # create request object request = urllib2.Request(url,data)
for key in header:
request.add_header(key,header[key])
# get host list try :
result = urllib2.urlopen(request)
except URLError as e:
if hasattr (e, 'reason' ):
print 'We failed to reach a server.'
print 'Reason: ' , e.reason
elif hasattr (e, 'code' ):
print 'The server could not fulfill the request.'
print 'Error code: ' , e.code
else :
response = json.loads(result.read())
result.close()
print "Number Of Hosts: " , len (response[ 'result' ])
for host in response[ 'result' ]:
print "Host ID:" ,host[ 'hostid' ], "HostName:" ,host[ 'name' ]
|
python脚本执行结果:
1
2
3
4
5
6
|
[root@yang python] # pythonget_group_one.py
Number Of Hosts: 4
Host ID : 10146 Host Name: DG - WY - KD - 3F3B - 00
Host ID : 10147 Host Name: DG - WY - KD - 3F3B - 01
Host ID : 10148 Host Name: DG - WY - KD - 3F3B - 02
Host ID : 10149 Host Name: DG - WY - KD - 3F3B - 03
|
curl命令:
1
2
|
curl - i - X POST - H 'Content-Type: application/json' - d '{"jsonrpc":"2.0","method":"host.get","params":{"output":["hostid","name"],"groupids":"14"},"auth":"11d2b45415d5de6770ce196879dbfcf1","id": 0}' http: / / 1.1 . 1.1 / zabbix / api_jsonrpc.php
|
curl命令执行结果:
1
|
{ "jsonrpc" : "2.0" , "result" :[{ "hostid" : "10146" , "name" : "DG-WY-KD-3F3B-00" },{ "hostid" : "10147" , "name" : "DG-WY-KD-3F3B-01" },{ "hostid" : "10148" , "name" : "DG-WY-KD-3F3B-02" },{ "hostid" : "10149" , "name" : "DG-WY-KD-3F3B-03" }], "id" : 0 }
|
4. itemsid.get方法获取单个主机下所有的监控项ID
根据标题3中获取到的所有主机id与名称,找到你想要获取的主机id,获取它下面的所有items。
官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/item
python脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
[root@yang python] # cat get_items.py
#!/usr/bin/env python2.7 #coding=utf-8 import json
import urllib2
# based url and required header url = "http://1.1.1.1/zabbix/api_jsonrpc.php"
header = { "Content-Type" : "application/json" }
# request json data = json.dumps(
{ "jsonrpc" : "2.0" ,
"method" : "item.get" ,
"params" :{
"output" :[ "itemids" , "key_" ],
"hostids" : "10146" ,
},
"auth" : "3c0e88885a8cf8af9502b5c850b992bd" , # theauth id is what auth script returns, remeber it is string
"id" : 1 ,
}) # create request object request = urllib2.Request(url,data)
for key in header:
request.add_header(key,header[key])
# get host list try :
result = urllib2.urlopen(request)
except URLError as e:
if hasattr (e, 'reason' ):
print 'We failed to reach a server.'
print 'Reason: ' , e.reason
elif hasattr (e, 'code' ):
print 'The server could not fulfill the request.'
print 'Error code: ' , e.code
else :
response = json.loads(result.read())
result.close()
print "Number Of Hosts: " , len (response[ 'result' ])
for host in response[ 'result' ]:
print host
#print "Host ID:",host['hostid'],"HostName:",host['name']
|
python脚本运行结果:
1
2
3
4
5
6
7
8
9
10
|
[root@yang python] # python get_items.py
Number Of Hosts: 54
{u 'itemid' : u '24986' , u 'key_' :u 'agent.hostname' }
{u 'itemid' : u '24987' , u 'key_' :u 'agent.ping' }
{u 'itemid' : u '24988' , u 'key_' :u 'agent.version' }
{u 'itemid' : u '24989' , u 'key_' :u 'kernel.maxfiles' }
{u 'itemid' : u '24990' , u 'key_' :u 'kernel.maxproc' }
{u 'itemid' : u '25157' , u 'key_' :u 'net.if.in[eth0]' }
{u 'itemid' : u '25158' , u 'key_' :u 'net.if.in[eth1]' }
… … |
curl命令:
1
2
|
curl - i - X POST - H 'Content-Type:application/json' - d '{"jsonrpc":"2.0","method":"item.get","params":{"output":"itemids","hostids":"10146","search":{"key_":"net.if.out[eth2]"}},"auth":"11d2b45415d5de6770ce196879dbfcf1","id": 0}' http: / / 1.1 . 1.1 / zabbix / api_jsonrpc.php
#此处加上了单个key的名称 |
curl命令执行结果:
1
|
{ "jsonrpc" : "2.0" , "result" :[{ "itemid" : "25154" }], "id" : 0 }
|
5. history.get方法获取单个监控项的历史数据
根据第4项的获取到的所有items id的值,找到想要监控的那项,获取它的历史数据。
官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/history/get
python脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
[root@yang python] # catget_items_history.py
#!/usr/bin/env python2.7 #coding=utf-8 import json
import urllib2
# based url and required header url = "http://1.1.1.1/zabbix/api_jsonrpc.php"
header = { "Content-Type" : "application/json" }
# request json data = json.dumps(
{ "jsonrpc" : "2.0" ,
"method" : "history.get" ,
"params" :{
"output" : "extend" ,
"history" : 3 ,
"itemids" : "25159" ,
"limit" : 10
},
"auth" : "3c0e88885a8cf8af9502b5c850b992bd" , # theauth id is what auth script returns, remeber it is string
"id" : 1 ,
}) # create request object request = urllib2.Request(url,data)
for key in header:
request.add_header(key,header[key])
# get host list try :
result = urllib2.urlopen(request)
except URLError as e:
if hasattr (e, 'reason' ):
print 'We failed to reach a server.'
print 'Reason: ' , e.reason
elif hasattr (e, 'code' ):
print 'The server could not fulfill the request.'
print 'Error code: ' , e.code
else :
response = json.loads(result.read())
result.close()
print "Number Of Hosts: " , len (response[ 'result' ])
for host in response[ 'result' ]:
print host
#print "Host ID:",host['hostid'],"HostName:",host['name']
|
python脚本执行结果:
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@yang python] # pythonget_items_history.py
Number Of Hosts: 10
{u 'itemid' : u '25159' , u 'ns' : u '420722133' ,u 'value' : u '3008' , u 'clock' : u '1410744079' }
{u 'itemid' : u '25159' , u 'ns' : u '480606614' ,u 'value' : u '5720' , u 'clock' : u '1410744139' }
{u 'itemid' : u '25159' , u 'ns' : u '40905600' ,u 'value' : u '6144' , u 'clock' : u '1410744200' }
{u 'itemid' : u '25159' , u 'ns' : u '175337062' ,u 'value' : u '2960' , u 'clock' : u '1410744259' }
{u 'itemid' : u '25159' , u 'ns' : u '202705084' ,u 'value' : u '3032' , u 'clock' : u '1410744319' }
{u 'itemid' : u '25159' , u 'ns' : u '263158421' ,u 'value' : u '2864' , u 'clock' : u '1410744379' }
{u 'itemid' : u '25159' , u 'ns' : u '702285081' ,u 'value' : u '7600' , u 'clock' : u '1410744439' }
{u 'itemid' : u '25159' , u 'ns' : u '231191890' ,u 'value' : u '3864' , u 'clock' : u '1410744499' }
{u 'itemid' : u '25159' , u 'ns' : u '468566742' ,u 'value' : u '3112' , u 'clock' : u '1410744559' }
{u 'itemid' : u '25159' , u 'ns' : u '421679098' ,u 'value' : u '2952' , u 'clock' : u '1410744619' }
|
curl命令:
1
|
curl - i - X POST - H 'Content-Type:application/json' - d '{"jsonrpc":"2.0","method":"history.get","params":{"history":3,"itemids":"25154","output":"extend","limit":10},"auth":"11d2b45415d5de6770ce196879dbfcf1","id": 0}' http: / / 1.1 . 1.1 / zabbix / api_jsonrpc.php
|
curl命令运行结果:
1
|
{ "jsonrpc" : "2.0" , "result" :[{ "itemid" : "25154" , "clock" : "1410744134" , "value" : "4840" , "ns" : "375754276" },{ "itemid" : "25154" , "clock" : "1410744314" , "value" : "5408" , "ns" : "839852515" },{ "itemid" : "25154" , "clock" : "1410744374" , "value" : "7040" , "ns" : "964558609" },{ "itemid" : "25154" , "clock" : "1410744554" , "value" : "4072" , "ns" : "943177771" },{ "itemid" : "25154" , "clock" : "1410744614" , "value" : "8696" , "ns" : "995289716" },{ "itemid" : "25154" , "clock" : "1410744674" , "value" : "6144" , "ns" : "992462863" },{ "itemid" : "25154" , "clock" : "1410744734" , "value" : "6472" , "ns" : "152634327" },{ "itemid" : "25154" , "clock" : "1410744794" , "value" : "4312" , "ns" : "479599424" },{ "itemid" : "25154" , "clock" : "1410744854" , "value" : "4456" , "ns" : "263314898" },{ "itemid" : "25154" , "clock" : "1410744914" , "value" : "8656" , "ns" : "840460009" }], "id" : 0 }
|
6. history.get方法获取单个监控项最后的值
只需把上个脚本中或curl中的limit参数改为1就可。
此时监控项的数据已拿到了,接下来的把它传给前台展示就行了。
本文转自杨云1028 51CTO博客,原文链接:http://blog.51cto.com/yangrong/1559123,如需转载请自行联系原作者