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

    xiaoxiao2024-12-06  49

    第十五章 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}]

    )

     

     

    最新回复(0)