近日公司准备自已做一个运维管理平台,其中的监控部分,打算调用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,如需转载请自行联系原作者