python调用zabbix api接口实时展示数据
准备自已做一个运维管理平台,其中的监控部分,打算调用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
# vim auth.py内容如下:
#!/usr/bin/env python2.7
#coding=utf-8
import json
import urllib2
from urllib2 import URLError
# based url and required header
url = "http://127.0.0.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脚本运行结果:
[root@Xururu ~]# python auth.py
Auth Successful. The Auth ID Is: 0c29d9efcee2ce856c41431d0dcd60d9
curl命令:
[root@Xururu ~]# 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://127.0.0.1/zabbix/api_jsonrpc.php
curl命令运行结果:
{"jsonrpc":"2.0","result":"9f08062e9315803e94dbd6a5f1828a45","id":0}
2. hostgroup.get方法获取所有主机组ID
把认证密钥放到脚本中,每次获取数据时都需要认证。此处是获取zabbix server上的所有主机组名称与ID号。
官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/hostgroup/get
python脚本:
[root@Xururu ~]# vim get_hostgroup_list.py
内容如下:
#!/usr/bin/env python2.7
#coding=utf-8
import json
import urllib2
from urllib2 import URLError
# based url and required header
url = "http://127.0.0.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":"0c29d9efcee2ce856c41431d0dcd60d9", # 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脚本执行结果:
[root@Xururu ~]# python get_hostgroup_list.py
Number Of Hosts: 6
Group ID: 5 GroupName: Discovered hosts
Group ID: 7 GroupName: Hypervisors
Group ID: 2 GroupName: Linux servers
Group ID: 1 GroupName: Templates
Group ID: 6 GroupName: Virtual machines
Group ID: 4 GroupName: Zabbix servers
curl命令:
[root@Xururu ~]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc": "2.0","method":"hostgroup.get","params":{"output":["groupid","name"]},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
curl命令运行结果:
[root@Xururu ~]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc": "2.0","method":"hostgroup.get","params":{"output":["groupid","name"]},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
HTTP/1.1 200 OK
Date: Sun, 13 Aug 2017 01:54:39 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16
X-Powered-By: PHP/5.4.16
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 1000
Content-Length: 270
Content-Type: application/json
{"jsonrpc":"2.0","result":[{"groupid":"5","name":"Discovered hosts"},{"groupid":"7","name":"Hypervisors"},{"groupid":"2","name":"Linux servers"},{"groupid":"1","name":"Templates"},{"groupid":"6","name":"Virtual machines"},{"groupid":"4","name":"Zabbix servers"}],"id":0}
3. host.get方法获取单个主机组下所有的主机ID。
根据标题2中获取到的主机组id,把主机组id填入到下边脚本中,就可以获得该主机组下所有的主机id。
官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/host/get
python脚本:
[root@Xururu ~]# vim get_group_one.py
#!/usr/bin/env python2.7
#coding=utf-8
import json
import urllib2
from urllib2 import URLError
# based url and required header
url = "http://127.0.0.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":"0c29d9efcee2ce856c41431d0dcd60d9", # 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脚本执行结果:
[root@Xururu ~]# python get_group_one.py
Number Of Hosts: 0
curl命令:
[root@Xururu ~]# curl -i -X POST -H'Content-Type: application/json' -d '{"jsonrpc":"2.0","method":"host.get","params":{"output":["hostid","name"],"groupids":"14"},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
curl命令执行结果:
[root@Xururu ~]# curl -i -X POST -H'Content-Type: application/json' -d '{"jsonrpc":"2.0","method":"host.get","params":{"output":["hostid","name"],"groupids":"14"},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
HTTP/1.1 200 OK
Date: Sun, 13 Aug 2017 02:14:19 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16
X-Powered-By: PHP/5.4.16
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 1000
Content-Length: 36
Content-Type: application/json
{"jsonrpc":"2.0","result":[],"id":0}
4. itemsid.get方法获取单个主机下所有的监控项ID
根据标题3中获取到的所有主机id与名称,找到你想要获取的主机id,获取它下面的所有items。
官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/item
python脚本:
[root@Xururu ~]# vim get_items.py
#!/usr/bin/env python2.7
#coding=utf-8
import json
import urllib2
from urllib2 import URLError
# based url and required header
url = "http://127.0.0.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":"0c29d9efcee2ce856c41431d0dcd60d9", # 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脚本运行结果:
[root@Xururu ~]# python get_items.py
Number Of Hosts: 0
curl命令:
[root@Xururu ~]# 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":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
curl命令执行结果:
[root@Xururu ~]# 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":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
HTTP/1.1 200 OK
Date: Sun, 13 Aug 2017 02:25:37 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16
X-Powered-By: PHP/5.4.16
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 1000
Content-Length: 36
Content-Type: application/json
{"jsonrpc":"2.0","result":[],"id":0} ### 执行结果
5. history.get方法获取单个监控项的历史数据
根据第4项的获取到的所有items id的值,找到想要监控的那项,获取它的历史数据。
官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/history/get
python脚本:
[root@Xururu ~]# vim get_items_history.py
#!/usr/bin/env python2.7
#coding=utf-8
import json
import urllib2
from urllib2 import URLError
# based url and required header
url = "http://127.0.0.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":"0c29d9efcee2ce856c41431d0dcd60d9", # 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脚本执行结果:
[root@Xururu ~]# python get_items_history.py
Number Of Hosts: 0
curl命令:
[root@Xururu ~]# 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":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
curl命令执行结果:
[root@Xururu ~]# 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":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
HTTP/1.1 200 OK
Date: Sun, 13 Aug 2017 02:34:44 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16
X-Powered-By: PHP/5.4.16
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 1000
Content-Length: 36
Content-Type: application/json
{"jsonrpc":"2.0","result":[],"id":0}
6. history.get方法获取单个监控项最后的值
只需把上个脚本中或curl中的limit参数改为1就可。
此时监控项的数据已拿到了,接下来的把它传给前台展示就行了。