zabbix api 允许你以编程的方式来检索和修改zabbix 的配置和提供访问历史数据
他被广泛应用于:
1. 创建新的应用结合zabbix
2.整合Zabbx 使用第三方软件
3.自动化日常工作
Zabbix API 是一个web 基于API和是作为web前端的一部分
它使用JSON-RPC 2.0 protocol
API 是有一组独立的方法组成,请求和响应在客户端和API是编码成JSON格式
更多信息关于协议和JSON 可以在JSON-RPC 2.0中找到
结构:
API 有一些方法组成 通常分组为单独的APIs.
每个方法执行一个特定的任务,host.create 方法术语一个host API是
用于创建新的主机。
大多数APIs 包含至少四种方法:get,create,update和delete 对于检索,创建,更新和删除数据
但是一些APIs可能提供一个完全不同的方法集
Performing requests 执行请求:
一旦你已经建立了前端,你可以使用远程HTTP 请求来调用API。
你需要做时发送HTTP POST 请求到 api_jsonrpc.php 文件位于前端目录下。
POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc
{"jsonrpc":"2.0","method":"apiinfo.version","id":1,"auth":null,"params":{}}
请求必须有Content-Type header 设置为其中一个值:
application/json-rpc, application/json or application/jsonrequest.
例如工作流:
下面章节会更详细的介绍一些用法示例:
认证:
在你访问任何数据在zabbix里 你需要登录和得到一个认证令牌。
这个可以通过使用user.login方法,让我们假设你需要登录:
让我们仔细看看请求对象,它具有以下属性:
jsonrpc JSON-RPC 协议版本用于API,Zabbix 实现了JSON-RPC version 2.0;
method 调用api的方法
id 请求的任意标识符
auth 一个用户认证token, 因为我们目前还没有,设置为null
如果你提供了正确的认证,API返回的是抱哈用户认证token:
{
"jsonrpc": "2.0",
"result": "0424bd59b807674191e7d77572075f33",
"id": 1
}
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib2
import urllib
import cookielib
import json
import httplib
import urllib
import urllib2
import json
def http_post():
url = 'http://192.168.137.3/zabbix/api_jsonrpc.php'
values = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "admin",
"password": "zabbix"
},
"id": 1
}
headers={"Content-Type":"application/json"}
jdata = json.dumps(values) # 对数据进行JSON格式化编码
req = urllib2.Request(url, jdata,headers) # 生成页面请求的完整数据
response = urllib2.urlopen(req) # 发送页面请求
return response.read() # 获取服务器返回的页面信息
resp = http_post()
print resp
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/templates/a8.py
{"jsonrpc":"2.0","result":"dae9c7e96eed20c90327741a7a8c6de1","id":1}
响应对象返回的包含以下属性:
jsonrpc - 再次,JSON-RPC protocol版本
result 方法返回的数据
Retrieving hosts 检索主机
我们现在有一个正确的用户认证token 用于访问zabbix的数据。
比如,让我们使用host.get 方法来检索IDs,host names和所有配置主机的接口
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib2
import urllib
import cookielib
import json
import httplib
import urllib
import urllib2
import json
def http_post():
url = 'http://192.168.137.3/zabbix/api_jsonrpc.php'
values = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "admin",
"password": "zabbix"
},
"id": 1
}
headers={"Content-Type":"application/json"}
jdata = json.dumps(values) # 对数据进行JSON格式化编码
req = urllib2.Request(url, jdata,headers) # 生成页面请求的完整数据
response = urllib2.urlopen(req) # 发送页面请求
return response.read() # 获取服务器返回的页面信息
def get_token():
resp = http_post()
print resp
print type(resp)
aa=json.loads(resp)
print aa
print type(aa)
token=aa['result']
return token
def get_hosts():
token=get_token()
url = 'http://192.168.137.3/zabbix/api_jsonrpc.php'
values={
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": [
"hostid",
"host"
],
"selectInterfaces": [
"interfaceid",
"ip"
]
},
"id": 2,
"auth": token
}
headers = {"Content-Type": "application/json"}
jdata = json.dumps(values) # 对数据进行JSON格式化编码
req = urllib2.Request(url, jdata, headers) # 生成页面请求的完整数据
response = urllib2.urlopen(req) # 发送页面请求
return response.read
print '-------------'
a=get_hosts()
print a
注意 认证属性是设置认证token 从调用user.login 得到的
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib2
import urllib
import cookielib
import json
import httplib
import urllib
import urllib2
import json
import requests
import json
def http_post():
url = 'http://192.168.137.3/zabbix/api_jsonrpc.php'
values = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "admin",
"password": "zabbix"
},
"id": 1
}
headers={"Content-Type":"application/json"}
jdata = json.dumps(values) # 对数据进行JSON格式化编码
req = urllib2.Request(url, jdata,headers) # 生成页面请求的完整数据
response = urllib2.urlopen(req) # 发送页面请求
return response.read() # 获取服务器返回的页面信息
def get_token():
resp = http_post()
#print resp
#print type(resp)
aa=json.loads(resp)
#print aa
#print type(aa)
token=aa['result']
return token
def get_hosts():
token=get_token()
url = 'http://192.168.137.3/zabbix/api_jsonrpc.php'
values={
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": [
"hostid",
"host"
],
"selectInterfaces": [
"interfaceid",
"ip"
]
},
"id": 3,
"auth": token,
}
headers = {"Content-Type": "application/json"}
# jdata = json.dumps(values) # 对数据进行JSON格式化编码
# req = urllib2.Request(url, jdata, headers) # 生成页面请求的完整数据
# response = urllib2.urlopen(req) # 发送页面请求
# return response.read
request = requests.post(url=url, headers=headers, data=json.dumps(values))
dict = json.loads(request.content)
return dict
print '-------------'
a=get_hosts()
#print a
print type(a)
print a['result']
print type(a['result'])
for i in a['result']:
print i['host']+'->'+str(i['interfaces'])
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/templates/a8.py
-------------
<type 'dict'>
[{u'host': u'testtlcb', u'hostid': u'10105', u'interfaces': [{u'interfaceid': u'2', u'ip': u'1.1.1.1'}]}, {u'host': u'nod01-192.168.137.2', u'hostid': u'10106', u'interfaces': [{u'interfaceid': u'3', u'ip': u'192.168.137.2'}]}, {u'host': u'Zabbix server', u'hostid': u'10084', u'interfaces': [{u'interfaceid': u'1', u'ip': u'127.0.0.1'}]}]
<type 'list'>
testtlcb->[{u'interfaceid': u'2', u'ip': u'1.1.1.1'}]
nod01-192.168.137.2->[{u'interfaceid': u'3', u'ip': u'192.168.137.2'}]
Zabbix server->[{u'interfaceid': u'1', u'ip': u'127.0.0.1'}]
Process finished with exit code 0
响应的对象包含有关主机的请求数据:
出于性能原因 我们推荐总是列出要检索的对象属性,并避免检索所有的内容
创建一个新的item:
让我们创建一个新的item 在"Zabbix server” 使用数据,我们从先前的host.get 请求得到的
{u'host': u'Zabbix server', u'hostid': u'10084', u'interfaces': [{u'interfaceid': u'1', u'ip': u'127.0.0.1'}]}
{
"jsonrpc": "2.0",
"method": "item.create",
"params": {
"name": "Free disk space on $1",
"key_": "vfs.fs.size[/home/joe/,free]",
"hostid": "10084",
"type": 0,
"value_type": 3,
"interfaceid": "1",
"delay": 30
},
"auth": "0424bd59b807674191e7d77572075f33",
"id": 3
}
{u'jsonrpc': u'2.0', u'result': {u'itemids': [u'23804']}, u'id': 3}
成功的响应会得到新创建item的ID ,可用于下列请求中的项:
item.create 方法和其他创建方法一样可以接收对象数据,创建多个items使用一个API调用
创建多个触发器:
因此 它创建方法接收数组,我们可以早呢更加多个触发器
def create_triggers():
token = get_token()
url = 'http://192.168.137.3/zabbix/api_jsonrpc.php'
values = {
"jsonrpc": "2.0",
"method": "trigger.create",
"params": [
{
"description": "tlcb Processor load is too high on {HOST.NAME}",
"expression": "{Template App HTTP Service:net.tcp.service[http].max(#3)}=0",
},
{
"description": "tlcb Too many processes on {HOST.NAME}",
"expression": "{Template App HTTP Service:net.tcp.service[http].max(#3)}=0",
}
],
"auth": token,
"id": 4
}
headers = {"Content-Type": "application/json"}
# jdata = json.dumps(values) # 对数据进行JSON格式化编码
# req = urllib2.Request(url, jdata, headers) # 生成页面请求的完整数据
# response = urllib2.urlopen(req) # 发送页面请求
# return response.read
request = requests.post(url=url, headers=headers, data=json.dumps(values))
dict = json.loads(request.content)
return dict
a=create_triggers()
print a
一个成功的响应会包含 新创建的triggers 的IDs:
{
"jsonrpc": "2.0",
"result": {
"triggerids": [
"17369",
"17370"
]
},
"id": 4
}
更新一个item:
启用一个item,设置它的状态为0