深入浅出Zabbix 3.0 -- 第十五章 Zabbix 协议与API
今天是六.一儿童节,祝小朋友们节日快乐!发完此文就带我家小朋友出去玩耍了。
第十五章 Zabbix 协议与API
本章将介绍和开发相关的Zabbix协议和API的内容,通过对Zabbix协议和API的深入了解,你可以利用Zabbix协议编写客户端程序并将其嵌入的产品或系统中,并将数据发送到Zabbix server,这在无法安装Zabbixagent等程序的场景(例如专用的嵌入式系统)中非常有用。你也可以利用Zabbix API开发自己的业务系统,或灵活的与现有系统整合集成。
15.1 Zabbix 协议
Zabbix协议非常简单,通过Zabbix协议你可以开发自有的客户端,不用依赖任何Zabbix提供的工具就能把数据发送到Zabbixserver中,这种方式极大的满足了专用系统的监控需求。
Zabbix 协议组成结构为:
<HEADER><DATA_LENGTH><DATA>
其中各部分含义如下:
<HEADER>:数据头部,长度为5个字节,内容为ZBXD\x01。实际上前面4个字节是头部,第五个字节用来指定协议的版本,当前,只有版本 1 是支持的(0x01 HEX)
<DATA_LENGTH>:数据长度,长度为8个字节,内容为16进制。例如1将格式化为01/00/00/00/00/00/00/00,一个8字节(或64-bit)16进制的数字。
<DATA>:数据内容,使用JSON格式。为了防止Server的内存溢出,限定一次传输的数据不能超过128MB。
协议
Zabbix get协议非常简单和容易实现的,实际上,你只需要把key发送数据到Zabbix server的10050端口,Zabbix agent返回响应数据。在shell脚本中可以轻松的实现。
# telnet 127.0.0.1 10050
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is ‘^]‘.
agent.version
ZBXD3.0.1Connection closed by foreign host.
在上面例子中通过telnet收集agent 版本,你会注意到返回的数据是以ZBXD开始,后面是实际的数据即3.0.1。通过协议直接从安装在server中的agent收集数据并在shell脚本中使用。
使用该协议时不需要登录到server,并且可以监测所有agent中使用UserParameter定义的key。
15.1.2 Zabbix sender协议
Zabbix sender发送的数据中可以包含来自不同主机或不同item key的数据,例如:
{
"request":"sender data",
"data":[
{
"host":"Host name 1",
"key":"item_key",
"value":"33"},
{
"host":"Host name 2",
"key":"item_key",
"value":"55"
}
]
}
Zabbix sender发送的数据中还可以包含时间戳,例如:
{
"request":"sender data",
"data": [
{
"host": "Host name 1",
"key": "item_key",
"value": "33",
"clock": 1381482894
},
{
"host": "Host name 2",
"key": "item_key",
"value": "55",
}
],
"clock":1381482905
}
在协议中clock是一个选项,在JSON对象中以及数据部分的结尾可以忽略。当你编写自己的Zabbix sender程序时,通过 clock参数可以指定item已被接收的时间戳。
Zabbix server返回的响应数据格式如下:
{
"response":"success",
"info":"Processed 1 Failed 1 Total 2 Seconds spent0.000253"
}
在响应数据中,response的状态可以是success或failure。有些items接收失败后,在info中只有简单的失败数量,没有更详细的失败items的信息,无法提供是哪个item失败以及失败的原因。。
15.1.3 Zabbix agent 协议
Zabbix agent有主动式(Active)和被动式(Passive)两种,开发客户端程序时多以主动式协议开发,因此在这里主要介绍Zabbix agent(主动式)协议。主动式agent协议稍微复杂一些,它涉及到多个步骤。当一个主动式agent启动后,首先会连接到server询问需要对哪些items进行监控。发送的查询数据如下:
<HEADER><DATALEN>{
"request":"active checks",
"host":"< Host name >"
}
如果主机发送的数据中有metadata时,发送的查询数据如下:
<HEADER><DATALEN>{
"host":"Host name",
"host_metadata": "apache|mysql|postfix",
"request":"active checks"
}
如果主机没有配置默认的监听IP地址或端口时,发送的查询数据如下:
<HEADER><DATALEN>{
"host":"Host name",
"ip":"127.0.0.1",
"port": 10055,
"request":"active checks"
}
发送请求的主机允许被监控并且配置有active items时,agent将从server接收响应的数据如下:
<HEADER><DATALEN>{
"response":"success",
"data":[{
"key":"log[\/var\/log\/localmessages,@errors]",
"delay":1,
"lastlogsize":12189,
"mtime":0
},
{
"key":"agent.version",
"delay":"900"
}]
"regexp":[
{
"name":"errors",
"expression":"error",
"expression_type":0,
"exp_delimiter":",",
"case_sensitive":1
}]
}
Zabbix server响应中response必须是success,并在后面列出需要监控的items和delay。当需要监控的items为log和logrt时,server将在响应中包含lastlogsize,如果items为logrt时还需要在响应中包含mtime。如果在server中定义了全局正则表达式,将在regexp当中响应。如果使用了user macro,key将被解析并以最初的key发送key_orig,最初的key是user macro名称。
当agent收到响应数据后,将关闭TCP连接,开始收集items的监控数据。当数据收集完成后,这些收集的items数据将发送到server中,发送的数据如下:
<HEADER><DATALEN>{
"request":"agentdata",
"data":[
{
"host":"HOSTNAME",
"key":"log[\/var\/log\/localmessages]",
"value":"Sep 16 18:26:44 linux-h5fr dhcpcd[3732]:eth0: adding default route via 192.168.1.1 metric 0",
"lastlogsize":4315,
"clock":1360314499,
"ns":699351525
},
{
"host":"<hostname>",
"key":"agent.version",
"value":"2.0.1",
"clock":1252926015
}
],
"clock":1252926016
}
在实现协议时对log类型的items必须确认发送了lastlogsize,对logrt类型的items发送了mtime。
当server收到发送的数据后返回响应数据如下:
{
"response":"success",
"info":"Processed 2 Failed 0 Total 2 Seconds spent0.000110"
}
其他agent可能接收的响应数据:
主机未监控的响应
<HEADER><DATALEN>{
"response":"failed",
"info":"host [Host name] not monitored"
}
主机不存在的响应,agent将接收
<HEADER><DATALEN>{
"response":"failed",
"info":"host [Host name] not found"
}
主机被监控,但没有配置主动式items
<HEADER><DATALEN>{
"response":"success",
"data":[]
}
15.1.4 Java实现Zabbix sender协议实例
下面通过JAVA语言编写的代码片断演示Zabbix sender协议的实现,通过这个例子你很容易扩展开发自己的sender程序。
private String buildJSonString(String host, String item,Longtimestamp, String value){
return "{"
+ "\"request\":\"sender data\",\n"
+ "\"data\":[\n"
+ "{\n"
+ "\"host\":\""+ host + "\",\n"
+ "\"key\":\"" +item + "\",\n"
+ "\"value\":\""+ value.replace("\\", "\\\\")
+ "\",\n"
+ "\"clock\":" +timestamp.toString()
+ "}]}\n" ;
}
这段代码简单的返回JSON格式的发送数据,只需要你提供主机、itemkey、item值和timestamp。
当收集到需要发送的JSON格式的数据后,打开一个socket连接,发送数据。如下代码所示。
String data = buildJSonString( host,item,value);
zabbix = new Socket(zabbixServer, zabbixPort);
zabbix.setSoTimeout(TIMEOUT);
out = new OutputStreamWriter(zabbix.getOutputStream());
int length = data.length;
Zabbix协议中发送的数据为<HEADER><DATALEN><DATA>,使用下面的代码生成数据。
out.write(new byte[] {
‘Z‘, ‘B‘, ‘X‘, ‘D‘,
‘\1‘,
(byte)(length & 0xFF),
(byte)((length >> 8) & 0x00FF),
(byte)((length >> 16) & 0x0000FF),
(byte)((length >> 24) & 0x000000FF),
‘\0‘,‘\0‘,‘\0‘,‘\0‘});
把数据写到socket,属性数据后关闭socket。
out.write(data);
out.flush();
out.close();
现在你需要到Zabbix server上看结果,如果看到响应是success,那就可以关闭InputStream。
in = zabbix.getInputStream();
final int read = in.read(response);
String respStatus = (String) getValue(response);
if (read !=2 || respStatus.equals(ZBX_SUCCESS)) {
in.close();
}
15.1.5 Python实现Zabbix sender协议实例
Python是目前广泛使用的一种编程语言,下面通过一些代码想你展示如何实现Zabbix sender程序。
首先,需要导入simplejson和定义items_data:
import simplejson as smplj
items_data = []
现在,从items收集timestamp,如果它是空的,将收集当前的timestamp:
clock =zbxit.clock or time.time()
生成item,在JSON格式中添加host、key、item 和 clock:
items_data.append((‘\t\t{\n‘
‘\t\t\t"host":%s,\n‘
‘\t\t\t"key":%s,\n‘
‘\t\t\t"value":%s,\n‘
‘\t\t\t"clock":%s}‘) % (json.dump(zbxit.host),json.dump(zbxit.key), json.dump(zbxit.value), clock))
将item放到协议的数据JSON对象中:
json_items = (‘{\n‘
‘\t"request":"sender data",\n‘
‘\t"data":[\n%s]\n‘
‘}‘) % (‘,\n‘.join(items_data))
收集数据长度并生成协议传输的数据:
data_len = struct.pack(‘<Q‘, len(json_items))
packet = ‘ZBXD\1‘ + data_len + json_items
打开 socket并发送packet:
zabbix = socket.socket()
zabbix.connect((zabbix_host, zabbix_port))
zabbix.sendall(packet)
当packet发送完成后,收集Zabbix server的响应:
resp_hdr = _recv_all(zabbix, 13)
接下来检查是否有效:
if not resp_hdr.startswith(‘ZBXD\1‘) or len(resp_hdr) != 13:
return False
resp_body_size = struct.unpack(‘<Q‘, resp_hdr[5:])[0]
resp_body = zabbix.recv(resp_body_size)
zabbix.close()
resp = json.loads(resp_body)
if resp.get(‘response‘) != ‘success‘:
return False
return True
15.2 Zabbix API
Zabbix提供了完整的API接口,几乎所有在前端页面可以完成的配置操作都可以通过API实现。第三方系统可以通过调用Zabbix API进行集成,收集Zabbix内部的数据进行分析和处理。用户可以非常方便的在Zabbix上进行二次开发,实现自己的业务管理系统,满足自动化运维的需要。通过Zabbix API可以构建更加模块化的架构,也避免了对数据库的直接操作,从而保证数据的完整性和一致性。
15.2.1 API简介
Zabbix API是用PHP开发的基于JSON-RPC 2.0协议的轻量级远程过程调用接口(JSON-RPC),利用HTTP/HTTPS协议进行传输。Zabbix前端提供了一个入口,通过访问http://<zabbix服务器前端地址>/zabbix/api_jsonrpc.php,允许你用JSON-RPC协议创建、更新和收集Zabbix对象并完成任何需要的操作。
Zabbix从v1.8版本提供API,经过多个版本的变化和发展,目前v3.0版本中的API已经趋于完善和成熟。从v2.0.4版本开始,API和Zabbix自身融合在一起发布,你可以使用apiinfo.version方法发现当前API的版本,以便在开发应用时使用与当前版本匹配的方法。虽然Zabbix提供主要版本API的向后兼容,但是在每个主要的发布版本中都会有一些功能的变化,当使用的Zabbix版本升级后一定要留意API的变化,及时更新应用代码。
你可以在Zabbix官网(http://zabbix.org/wiki/Docs/api/libraries)看到不同编程语言提供的第三方工具和Zabbix API库,使用你喜欢的语言进行开发。
15.2.2 API的使用
Zabbix API提供了很多方法,当用户的身份验证通过收集令牌后,就可以对Zabbix对象进行很多不同类型的操作。尤其在大型的网络环境中配置Zabbix,你会发现Zabbix API相当有用,通过API提供的操作方法可以完成批量、自动化的配置任务。
Zabbix API采用JSON-RPC协议,意味着调用任何方法都需要发送POST请求(HTTP 报头中 Content-Type必须设置为application/json,也可以设置成application/json-rpc或者application/jsonrequest),输入或输出JSON格式的数据。使用API的基本流程如下图15-1所示。
图 15-1
一个简单查询Zabbix API的代码格式如下:
{
"jsonrpc": "2.0",
"method": "method.name",
"params": {
"param_1_name": "param_1_value",
"param_2_name": "param_2_value"
},
"id": 1,
"auth": "159121ba47d19a9b4b55124eab31f2b81"
}
这段代码的含义是:
"jsonrpc":"2.0":API使用的JSON-RPC协议的版本号。
"method":"method.name":API调用的方法,例如host.create或item.update等。
"params":通过传递JSON对象作为特定方法的参数,例如调用item.create时需要提供name和key_等参数。
"id":JSON请求的任意标识符,每个请求的响应也会使用和请求相同的id。
"auth":用户身份验证的令牌。未验证前填写null。
举个用户登录系统收集身份验证令牌的例子:
{
"jsonrpc":"2.0",
"method":"user.login",
"params": {
"user":"Admin",
"password":"zabbix"
},
"id": 1,
"auth": null
}
包含令牌的API返回响应结果:
{
"jsonrpc":"2.0",
"result":"0424bd59b807674191e7d77572075f33",
"id": 1
}
Zabbix API由大量分组的方法组成,每一个方法完成特定的任务,例如host.create方法是归属于host API组,用来创建新的主机的方法。大部分APIs至少包含get、create、update和delete 4个方法,有的APIs也可能提供一些完全不同的方法。具体APIs方法的内容参考官方网站 https://www.zabbix.com/documentation/3.0/manual/api/reference。
15.2.2 Zabbix API支持的数据类型
Zabbix API支持的数据类型如下表15-1所示。
表15-1
类型 | 说明 |
bool | 布尔值,true或false。 |
flag | 当传递的值不为null和false时被认为是true。 |
integer | 整数。 |
float | 浮点数。 |
string | 字符串。 |
text | 较长的字符串。 |
timestamp | UNIX时间戳。 |
array | 数组。 |
object | 对象。 |
query | 定义了一个值应该返回什么数据。可以定义一个属性名称只返回特定的属性值,或为预定义的值:
|
一些对象属性使用很短的标签来描述它们的行为,我们称之为属性标签(Property labels),可以使用以下标签:
readonly:属性值是自动设置的,并且不能定义或由客户端更改。
constant:创建一个对象时可以设置属性值,但在以后不能更改。
常见的get方法参数(所有get方法都支持)如下表15-2所示。
表15-2
参数 | 类型 | 说明 |
countOutput | Flag | 返回响应结果中的记录数,不是实际的数据。 |
Editable | boolean | 是指为true时只返回用户拥有写权限的对象,默认为false。 |
excludeSearch | Flag | 返回不匹配在search参数中给定数据的结果。 |
Filter | Object | 仅返回完全匹配给定过滤条件的结果。参数为数组,key是属性名称,value可以是单值或数组。text字段不能使用此参数。 |
Limit | integer | 限制返回结果的数量。 |
output | Query | 返回对象的属性,默认为extend。 |
preservekeys | Flag | 返回以ID做为key的数字。 |
Search | object | 返回匹配给定通配符的结果。参数为数组,key是属性名称,value是用于搜索的字符串。如果没有指定其他选项,将完成一个 LIKE “%...%”的搜索。仅用于string或text字段。 |
searchByAny | boolean | 设置为true时返回匹配任意在filter或search参数中给定条件的结果,默认为false。 |
searchWildcardsEnabled | boolean | 设置为true时允许在search参数中使用通配符 * ,默认为false。 |
sortfield | string/array | 以给定的属性对返回结果进行排序。 |
sortorder | string/array | 排序,如果一个数组传递后,每个值将匹配到在sortfield参数中给定的对应的属性。ASC-升序,DESC-降序。 |
startSearch | Flag | search参数开始比较,完成一个 LIKE “...%”的搜索。 |
15.2.3 Shell中使用API
在shell中使用curl和Zabbix API进行交互,curl是一个综合性的传输工具,可以使用不同的协议,在我们的例子中将使用HTTP协议。实际环境中建议使用HTTPS。
先做个简单查询,收集当前Zabbix系统的版本。
# curl --include --netrc--request POST --header "Content-Type:application/json"http://127.0.0.1/mon/api_jsonrpc.php -d@-
在选项中设置了Content-Type为JSON,用-d@-选项允许curl从标准输入读取数据,当命令执行后,会等待你输入信息。现在我们粘贴下面的内容作为输入:
{
"jsonrpc":"2.0",
"method":"apiinfo.version",
"id":1,
"auth":null,
"params":{}
}
按Crtl + D结束输入,你会看到类似下面的返回内容:
HTTP/1.1 200 OK
Date: Wed, 03 Aug 2016 04:16:51 GMT
Server: Apache/2.4.6 (CentOS) 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: 41
Content-Type: application/json
{"jsonrpc":"2.0","result":"3.0.1","id":1}
在响应返回的标准HTTP报头后面,你会发现查询返回的结果,"result":"3.0.1"表明当前Zabbix的版本是3.0.1。
下面的例子是通过API进行用户身份验证。
# curl --insecure--include --netrc --request POST --header"Content-Type:application/json"https://127.0.0.1/zabbix/api_jsonrpc.php -d@-
粘贴下面的数据到标准输入。
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "admin",
"password": "admin"
},
"auth": null,
"id": 0
}
然后按Crtl + D,你会看到类似下面的内容:
HTTP/1.1 200 OK
Date: Wed, 03 Aug 2016 05:37:16 GMT
Server: Apache/2.4.6 (CentOS) 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: 68
Content-Type: application/json
{"jsonrpc":"2.0","result":"d4eba50afc136bee76365851c596c75e","id":0}
从返回结果中可以看到我们已经通过身份认证,收集的令牌在后续的操作中会使用。现在通过curl查询Zabbix server的信息。
# curl --insecure--include --netrc --request POST --header"Content-Type:application/json"https://127.0.0.1/zabbix/api_jsonrpc.php -d@-
在标准输入中粘贴下面的内容:
{
"jsonrpc":"2.0",
"method":"host.get",
"params": {
"output": [
"hostid",
"host"
],
"selectInterfaces": [
"interfaceid",
"ip"
]
},
"id": 2,
"auth": " d4eba50afc136bee76365851c596c75e"
}
然后按Crtl + D,你会看到类似下面的内容:
HTTP/1.1 200 OK
Date: Wed, 03 Aug 2016 06:01:23 GMT
Server: Apache/2.4.6 (CentOS) 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: 581
Content-Type: application/json
{"jsonrpc":"2.0","result":[{"hostid":"10084","host":"Zabbixserver","interfaces":[{"interfaceid":"1","ip":"127.0.0.1"}]}],"id":2}
在返回的结果中可以看到Zabbix server相关的信息,一定要记住不论是get、create,还是update、delete等操作都要使用身份验证的令牌,最好使用HTTPS协议传输。
下面通过一个完整的脚本文件查询Zabbix server中所有的主机名称。
# vi get_host_info.sh
#!/bin/bash
USER="Admin"
PASS="zabbix"
API=‘https://192.168.10.107/mon/api_jsonrpc.php‘
CURL=‘/usr/bin/curl‘
authenticate() {
$CURL -s -X POST -H ‘Content-Type: application/json‘ \
-d "{\"jsonrpc\":\"2.0\",\"method\":\"user.login\", \
\"params\":{\"user\":\"$PASS\",\"password\":\"$USER\"}, \
\"auth\":null,\"id\":0}" $API | jq‘."result"‘ | cut -d "\"" -f2
}
AUTH_TOKEN=$(authenticate)
echo -e "$AUTH_TOKEN \n"
host_get() {
$CURL -s -X POST -H ‘Content-Type: application/json‘ \
-d "{\"jsonrpc\":\"2.0\",\"method\":\"host.get\",\"params\": \
{\"output\":\"extend\",\"filter\":{\"host\":\"\"}}, \
\"auth\": \"$AUTH_TOKEN\",\"id\":0}" $API |jq ‘."result"[]["name"]‘ | cut -d"\"" -f2
}
HOSTGETNAME=$(host_get)
echo -e "$HOSTGETNAME \n"
通过这个脚本可以你可以收集Zabbix server中所有host名单,在脚本中使用了JSON处理工具jq,脚本运行的结果如下:
fff6bfe57731c80a8bfce3f2172c0391
zabbix server
website100
website101
website102
Bind server
15.2.3 Python中使用API
在Python中一样使用curllib2调用Zabbix API接口,下面是一个收集系统中主机的信息的例子。
# vi get_host.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import json
import urllib2
import sys
from urllib2 import Request, urlopen, URLError, HTTPError
url = ‘http://127.0.0.1/zabbix/api_jsonrpc.php‘
zabbixUser="Admin"
zabbixPassword="zabbix"
obj = {"jsonrpc": "2.0","method":"user.login","params": {"user":zabbixUser,"password": zabbixPassword},"id": 0}
data = json.dumps(obj)
request = urllib2.Request(url, data, {‘Content-Type‘:‘application/json‘})
response = urllib2.urlopen(request)
res = json.load(response)
auth_token=[]
""" 错误处理"""
if ‘error‘ in res:
print ‘An erroroccurred! %s‘ %res["error"]
sys.exit(-1)
try:
auth_token=res["result"]
except:
auth_token=res["error"]["data"]
print auth_token
sys.exit()
print "Auth token is %s" %(auth_token)
""" 收集主机信息"""
obj2 = {"jsonrpc": "2.0","method":"host.get","params": {"output":"extend","filter":{"host":""}},"auth": auth_token,"id":1}
data2 = json.dumps(obj2)
request2 = urllib2.Request(url, data2, {‘Content-Type‘:‘application/json‘})
response2 = urllib2.urlopen(request2)
res2 = json.load(response2)
"""只打印所有主机名称"""
hosts=[]
for i in range(len(res2["result"])):
hosts.append(res2["result"][i]["host"])
print hosts
输出结果类似下面的内容:
Auth token is eed5d8d2f6554a7ee65d2d625075368f
[u‘Zabbix server‘, u‘website101‘, u‘website102‘, u‘website103‘ , u‘Bindserver‘]
当你在自己的系统中运行上面的代码时需要对url、用户名和密码进行修改。这里只是简单的举个例子演示一下Python中利用urllib2调用Zabbix API的方法。
15.2.4 PyZabbix
为了更简单方便的使用Zabbix API,有人把 Zabbix API 封装成Python模块使用。其中PyZabbix(https://github.com/lukecyca/pyzabbix)就是一个小巧紧凑的模块,下面我们就介绍下PyZabbix的使用。
首先通过pip安装PyZabbix模块。
# pip install pyzabbix
当安装完成后,在Python脚本中就可以导入和使用模块。简单的做个测试。
Python 2.7.5 (default, Nov 20 2015, 02:00:19)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or"license" for more information
>>> from pyzabbix import ZabbixAPI
>>> zapi = ZabbixAPI("http://127.0.0.1/zabbix/")
>>> zapi.login("Admin","zabbix")
>>> zapi.host.get(output="refer")
[{u‘hostid‘: u‘10084‘}, {u‘hostid‘: u‘10108‘}, {u‘hostid‘:u‘10118‘}, {u‘hostid‘: u‘10120‘}, {u‘hostid‘: u‘10109‘}]
>>>
当你看到上面的结果时,你会发现PyZabbix模块使用方法很简单,在上面的代码中你只需要填写正确的url、用户名和密码就可以了。
PyZabbix中调用Zabbix API的方法主要有两种:
动态映射pyzabbix.api.ZabbixAPI的方法,例如result = zapi.host.get(status=1)
参数传递的方法,例如 result= zapi.do_request(‘host.get‘, {‘status‘:1})
Python中处理JSON非常方便,JSON数据结构能直接映射到Python的数据类型,不需要额外进行类型转换的处理。下面的表显示Zabbix API支持的特定类型在PyZabbix函数中的使用方法。如下表15-3所示。
表 15-3
类型 | Zabbix API JSON | PyZabbix |
Bool | {"jsonrpc" : "2.0" "method": "host.get", "params" : { "editable" : "true" } "auth" : <....> "id" : 1 }} | zh.host.get(editable="true") |
flag | {"jsonrpc" : "2.0" | zh.host.get(countOutput=1) |
integer | {"jsonrpc" : "2.0" "method": "host.get", "params" : { "limit" : 10} "auth" : <....> "id" : 1 }} | zh.host.get(limit=10) |
string | {"jsonrpc" : "2.0" "method": "host.get", "params" : { "sortfield": "name" } "auth" : <....> "id" : 1 }} | zh.host.get(sortfield="name") |
timestamp | {"jsonrpc": "2.0", "method": "event.get", "params": { "time_from": "1349797228", "time_till": "1350661228",}, "auth": <...>, "id": 1 } | zh.event.get(time_from="1349797228", time_ till= "1350661228") |
array | {"jsonrpc" : "2.0" "method": "host.get", "params" : { "hostids" : [1001, 1002, 1003] } "auth" : <....> "id" : 1 }} | zh.host.get(hostids=[1001, 1002,1003]) |
object | {"jsonrpc" : "2.0" | zh.host.get(filter={"name":["Alpha", "Beta"]}) |
query | {"jsonrpc" : "2.0" "method": "host.get", "params" : { "output": "extend" } "auth" : <....> "id" : 1 }} | zh.host.get(output="extend") |
用法举例如下。
#!/usr/bin/python
# -*- coding: utf-8 -*-
from pyzabbix import ZabbixAPI
from datetime import datetime, timedelta,time
url = ‘http://127.0.0.1/zabbix/api_jsonrpc.php‘
zUser="Admin"
zPassword="zabbix"
zb = ZabbixAPI(url)
zb.login(user= zUser, password=zPassword)
#收集主机接口信息
Hostinfo=zb.host.get(filter={"host":"Zabbix server"},
output=["host","interfaces"],
selectInterfaces="extend"
)
print hostinfo
#添加item
host_name = ‘hostone‘
hosts = zb.host.get(filter={"host": host_name})
if hosts:
host_id =hosts[0]["hostid"]
print("Found host id{0}".format(host_id))
zb.item.create(
hostid=host_id,
description=‘Useddisk space on $1 in %‘,
key_=‘vfs.fs.size[/,pused]‘,
)
else:
print("No hosts found")
#创建维护期间
gid = zb.hostgroup.get(output="extended",filter={"name":"groupname"})
gid = gid[0][‘groupid‘]
dt_start =datetime.combine(datetime.today(),time(23,30))
dt_end = dt_start + timedelta(minutes=300)
dt_start_ms =dt_start.strftime("%s")
print dt_start_ms
zb.maintenance.create(
name="Monthly Deployment",
active_since=dt_start.strftime("%s"),
active_till = dt_end.strftime("%s"),
groupids=[str(gid)],
timeperiods=[{"timeperiod_type": 3,
"every": 1,"dayofweek": 64,
"start_time":dt_start.strftime("%s"),
"period": 3600}]
)
出自http://ustogether.blog.51cto.com/8236854/1931194,如需转载请与作者联系。
本文出自 “大白小白一起学” 博客,转载请与作者联系!