深入浅出Zabbix 3.0 -- 第十五章 Zabbix 协议与API

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅出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-bit16进制的数字。

  • <DATA>:数据内容,使用JSON格式。为了防止Server的内存溢出,限定一次传输的数据不能超过128MB

  • 协议

Zabbix get协议非常简单和容易实现的,实际上,你只需要把key发送数据到Zabbix server10050端口,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的状态可以是successfailure。有些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,并在后面列出需要监控的itemsdelay。当需要监控的itemsloglogrt时,server将在响应中包含lastlogsize,如果itemslogrt时还需要在响应中包含mtime。如果在server中定义了全局正则表达式,将在regexp当中响应。如果使用了user macrokey将被解析并以最初的key发送key_orig,最初的keyuser 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格式的发送数据,只需要你提供主机、itemkeyitem值和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格式中添加hostkeyitem 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对象并完成任何需要的操作。

Zabbixv1.8版本提供API,经过多个版本的变化和发展,目前v3.0版本中的API已经趋于完善和成熟。从v2.0.4版本开始,APIZabbix自身融合在一起发布,你可以使用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.createitem.update等。

  • "params":通过传递JSON对象作为特定方法的参数,例如调用item.create时需要提供namekey_等参数。

  • "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至少包含getcreateupdatedelete 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

布尔值,truefalse

flag

当传递的值不为nullfalse时被认为是true

integer

整数。

float

浮点数。

string

字符串。

text

较长的字符串。

timestamp

UNIX时间戳。

array

数组。

object

对象。

query

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

  • extend:返回所有对象的属性

  • count:返回已接收记录的数量,仅一些嵌套 selectsubselects)中支持

一些对象属性使用很短的标签来描述它们的行为,我们称之为属性标签(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 “%...%”的搜索。仅用于stringtext字段。

searchByAny

boolean

设置为true时返回匹配任意在filtersearch参数中给定条件的结果,默认为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中使用curlZabbix API进行交互,curl是一个综合性的传输工具,可以使用不同的协议,在我们的例子中将使用HTTP协议。实际环境中建议使用HTTPS

先做个简单查询,收集当前Zabbix系统的版本。

# curl --include --netrc--request POST --header "Content-Type:application/json"http://127.0.0.1/mon/api_jsonrpc.php [email protected]

在选项中设置了Content-TypeJSON,用[email protected]选项允许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 [email protected]

粘贴下面的数据到标准输入。

{

"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 [email protected]

在标准输入中粘贴下面的内容:

{

    "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相关的信息,一定要记住不论是getcreate,还是updatedelete等操作都要使用身份验证的令牌,最好使用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模块使用。其中PyZabbixhttps://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}]

)

 

 

技术分享

出自http://ustogether.blog.51cto.com/8236854/1931194,如需转载请与作者联系。

本文出自 “大白小白一起学” 博客,转载请与作者联系!

以上是关于深入浅出Zabbix 3.0 -- 第十五章 Zabbix 协议与API的主要内容,如果未能解决你的问题,请参考以下文章

《深入浅出Mysql》——第十五章 SQL中的安全问题 + 第十六章 SQL Mode 及相关问题

深入浅出Zabbix 3.0 -- 第十一章 VMware 监控

书籍ZABBIX从入门到精通V3.0.1发布!

C++ Primer Plus学习:第十五章

java:第十五章

Java(第十五章)