第十五章 Zabbix 协议与API

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

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。

近日完成《深入浅出 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",
                },
                {
                       "host": "Host name 2",
                       "key": "item_key",
                       "value": "55",
                }
        ],
}

在协议中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,
       "ns":699351525
    },
    {
       "host":"<hostname>",
       "key":"agent.version",
       "value":"2.0.1",
    }
    ],
}

在实现协议时对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所示。

                            

zabbix创建用户接口 zabbix接口文档_前端

一个简单查询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)
  • 参数传递的方法,例如

Python中处理JSON非常方便,JSON数据结构能直接映射到Python的数据类型,不需要额外进行类型转换的处理。下面的表显示Zabbix API支持的特定类型在PyZabbix函数中的使用方法。如下表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,
    descriptinotallow='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,如需转载请与作者联系。

转载于:https://blog.51cto.com/ustogether/1931194