第十五章 Zabbix 协议与API

本章将介绍和开发相关的Zabbix协议和API的内容,通过对Zabbix协议和API的深入了解,你可以利用Zabbix协议编写客户端程序并将其嵌入的产品或系统中,并将数据发送到Zabbix server,这在无法安装Zabbix agent等程序的场景(例如专用的嵌入式系统)中非常有用。你也可以利用Zabbix API开发自己的业务系统,或灵活的与现有系统整合集成。

近日完成《深入浅出 zabbix 4.0》视频教程的录制并正式发布,该教程基于 zabbix 4.2 ,对Zabbix进行全面讲解。欢迎大家围观。课程链接:https://edu.csdn.net/course/detail/24870

15.1 Zabbix 协议

Zabbix协议非常简单,通过Zabbix协议你可以开发自有的客户端,不用依赖任何Zabbix提供的工具就能把数据发送到Zabbix server中,这种方式极大的满足了专用系统的监控需求。

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

定义了一个值应该返回什么数据。可以定义一个属性名称只返回特定的属性值,或为预定义的值:

  • 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  “...%”的搜索。

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"
 "method": "host.get",
 "params" : {
 "countOutput" : "1"  }
 "auth" : <....>
 "id" : 1
 }}

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"
 "method": "host.get",
 "params" : {
 "filter": {  "name":
 ["Alpha", "Beta"] }
 "auth" : <....>
 "id" : 1
 }}

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}]

)

深入浅出Zabbix 3.0 -- 第十五章 Zabbix 协议与API相关推荐

  1. zabbix专题:第十二章 zabbix proxy分布式监控配置

    zabbix专题:第十一章 zabbix proxy分布式监控配置             对Linux有兴趣的朋友加入QQ群:476794643 在线交流 本文防盗链:http://zhang789 ...

  2. 第二十五章补充内容 5 不能为0的变量

    // 第二十五章补充内容 5 不能为0的变量 /*#define DEBUG #include <iostream> #include <string> using names ...

  3. 【正点原子Linux连载】第三十五章 Linux内核顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  4. 【正点原子FPGA连载】第十五章 IP核之FIFO实验 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  5. 【正点原子Linux连载】第四十五章 pinctrl和gpio子系统实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  6. 【正点原子FPGA连载】第十五章 RGB LCD彩条显示实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  7. 【正点原子FPGA连载】 第三十五章双目OV5640摄像头HDMI显示实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  8. java十五章_java:第十五章

    第十五章 字符串1.字符串(String)的定义 String str="内容"; String str=new String(); //内容为null String str=ne ...

  9. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引...

    Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引 原文:Introduction to 3 ...

最新文章

  1. 5 个大厂 offer,该怎么选?
  2. Jquery each和map 的区别
  3. tcp三次握手为啥不是4次
  4. 关闭窗体后,进程仍然在运行的问题重现与解决
  5. docker compose 停止_Docker-Compose 基础与实战,看这一篇就够啦
  6. 用Qemu模拟vexpress-a9 (四) --- u-boot引导kernel,用nfs挂载根文件系统
  7. 给websocket加入心跳包防止自动断开连接
  8. 马来西亚热情拥抱阿里巴巴 马云倡议的eWTP首次落地海外
  9. 关于python学习,最系统的学习网站看这里
  10. どんな時、自分が幸福だと思いますか?
  11. 遇到local variable ‘e‘ referenced before assignment这样的问题应该如何解决
  12. 设置 CSDN 博文里代码块的颜色
  13. 如何清理浏览器缓存快捷键
  14. WSL下Kali 2021 启用mysql服务并通过主机连接
  15. centos6 安装 nscd 清除DNS缓存
  16. C# WinForms窗体淡出效果
  17. 制作一个带rEFInd引导菜单的WinPE启动光盘
  18. JMeter 基本身份验证
  19. 鸿蒙系统有哪些手机可以用,鸿蒙系统手机有哪些型号,鸿蒙系统手机什么时候上市...
  20. word格式角落的直角问题又名裁剪标记

热门文章

  1. Python库 turtlede的使用(绘制小黄人、樱花树、小猪佩奇、皮卡丘)
  2. Struts2框架安全缺陷 ZT
  3. Hbase索引( Phoenix二级索引)
  4. POJ1723 Soldiers 中位数
  5. python与贝叶斯_用Python实现贝叶斯定理
  6. oracle nvarchar2 substr,关于oracle中varchar2与nvarchar2的一点认识 - Qxun_dream
  7. Unity3d Webplayer 障蔽缓存机制
  8. AWS 助理架构师认证
  9. 记我的一次脑残行为-(win10家庭版)修改C盘Users目录下文件夹名
  10. 如何解锁Flash读写保护