第十五章 Zabbix 协议与API
本章将介绍和开发相关的Zabbix协议和API的内容,通过对Zabbix协议和API的深入了解,你可以利用Zabbix协议编写客户端程序并将其嵌入的产品或系统中,并将数据发送到Zabbix server,这在无法安装Zabbix agent等程序的场景(例如专用的嵌入式系统)中非常有用。你也可以利用Zabbix API开发自己的业务系统,或灵活的与现有系统整合集成。
15.1 Zabbix 协议
Zabbix协议非常简单,通过Zabbix协议你可以开发自有的客户端,不用依赖任何Zabbix提供的工具就能把数据发送到Zabbix server中,这种方式极大的满足了专用系统的监控需求。
Zabbix 协议组成结构为:
其中各部分含义如下:
:数据头部,长度为5个字节,内容为ZBXD\x01。实际上前面4个字节是头部,第五个字节用来指定协议的版本,当前,只有版本 1 是支持的(0x01 HEX) :数据长度,长度为8个字节,内容为16进制。例如1将格式化为01/00/00/00/00/00/00/00,一个8字节(或64-bit)16进制的数字。 :数据内容,使用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。
近日完成《深入浅出 zabbix 4.0》视频教程的录制并正式发布,该教程基于 zabbix 4.2 ,对Zabbix进行全面讲解。欢迎大家围观。课程链接:https://edu.51cto.com/sd/ce000
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进行监控。发送的查询数据如下:
"request":"active checks",
"host":"< Host name >"
}
如果主机发送的数据中有metadata时,发送的查询数据如下:
"host":"Host name",
"host_metadata": "apache|mysql|postfix",
"request":"active checks"
}
如果主机没有配置默认的监听IP地址或端口时,发送的查询数据如下:
"host":"Host name",
"ip":"127.0.0.1",
"port": 10055,
"request":"active checks"
}
发送请求的主机允许被监控并且配置有active items时,agent将从server接收响应的数据如下:
"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中,发送的数据如下:
"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":"
"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可能接收的响应数据:
主机未监控的响应
"response":"failed",
"info":"host [Host name] not monitored"
}
主机不存在的响应,agent将接收
"response":"failed",
"info":"host [Host name] not found"
}
主机被监控,但没有配置主动式items
"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协议中发送的数据为
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(' 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(' resp_body = zabbix.recv(resp_body_size) zabbix.close() resp = json.loads(resp_body) if resp.get('response') != 'success': return False return True Zabbix提供了完整的API接口,几乎所有在前端页面可以完成的配置操作都可以通过API实现。第三方系统可以通过调用Zabbix API进行集成,收集Zabbix内部的数据进行分析和处理。用户可以非常方便的在Zabbix上进行二次开发,实现自己的业务管理系统,满足自动化运维的需要。通过Zabbix API可以构建更加模块化的架构,也避免了对数据库的直接操作,从而保证数据的完整性和一致性。 Zabbix API是用PHP开发的基于JSON-RPC 2.0协议的轻量级远程过程调用接口(JSON-RPC),利用HTTP/HTTPS协议进行传输。Zabbix前端提供了一个入口,通过访问http:// 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库,使用你喜欢的语言进行开发。 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":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。 Zabbix API支持的数据类型如下表15-1所示。 表15-1 类型 说明 bool 布尔值,true或false。 flag 当传递的值不为null和false时被认为是true。 integer 整数。 float 浮点数。 string 字符串。 text 较长的字符串。 timestamp UNIX时间戳。 array 数组。 object 对象。 query 定义了一个值应该返回什么数据。可以定义一个属性名称只返回特定的属性值,或为预定义的值: extend:返回所有对象的属性 count:返回已接收记录的数量,仅一些嵌套 select(subselects)中支持 一些对象属性使用很短的标签来描述它们的行为,我们称之为属性标签(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 “...%”的搜索。 在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 在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的方法。 为了更简单方便的使用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,如需转载请与作者联系。
15.2 Zabbix API
15.2.1 API简介
15.2.2 API的使用
"jsonrpc": "2.0",
"method": "method.name",
"params": {
"param_1_name": "param_1_value",
"param_2_name": "param_2_value"
},
"id": 1,
"auth": "159121ba47d19a9b4b55124eab31f2b81"
}
15.2.2 Zabbix API支持的数据类型
15.2.3 Shell中使用API
15.2.3 Python中使用API
15.2.4 PyZabbix
"method": "host.get",
"params" : {
"countOutput" : "1" }
"auth" : <....>
"id" : 1
}}
"method": "host.get",
"params" : {
"filter": { "name":
["Alpha", "Beta"] }
"auth" : <....>
"id" : 1
}}