第13章 Zabbix API的使用

Zabbix的API非常丰富,界面上能够完成的操作几乎都可以通过API来实现。因此,Zabbix很容易实现与第三方程序的集成。本章将介绍Zabbix API的使用方法。通过本章的学习,读者可以加深对Zabbix API的理解并灵活运用。

13.1 Zabbix API简介

Zabbix API具有重要的功能,为第三方调用Zabbix、批量操作提供可编程接口,从而实现Zabbix监控平台与第三方系统集成。
Zabbix API是基于前端HTTP协议实现的,数据格式采用JSONRPC协议。
由于Zabbix的Web前端是用PHP语言编写的,PHP本身的性能与其相关配置参数有极大的关系。因此,在大型环境中使用需要对PHP进行优化,可以使用最新版本PHP 7,以及通过对前端进行负载均衡、服务器性能优化等技术提高PHP处理性能。

13.2 JSON-RPC

JSON-RPC是基于JSON的跨语言远程调用协议,比XML-RPC、WebService等基于文本的协议传输数据量要小。目前主流语言都有JSON-RPC的实现框架。

  1. JSON-RPC协议描述
    JSON-RPC协议非常简单,发起远程调用时向服务器传输数据的格式如下:
{"method": "getid", "params": ["arg"], "id": 1}

参数说明如下:

  • method:调用的方法名。
  • params:方法传入的参数,若无参数,则传入[]。
  • id:调用标识符,用于标识一次远程调用过程。
    服务器接收到JSON-RPC的调用请求后,处理该请求的方法调用,然后将结果返回调用方。返回的数据格式如下:
{   
    "result":       "id  is  000", 
    "error":        null, 
    "id":               1
} 

参数说明如下:

  • result:方法返回值,若无返回值或调用出错,则返回null。
  • error:调用时发生错误,若无错误则返回null。·
  • id:调用标识符,与调用方传入的标识符一致。

以上就是JSON-RPC协议规范的内容,它非常简单、小巧,且便于用各种语言实现。

  1. Zabbix API支持的数据类型
    Zabbix API支持的基本数据类型如表13-1所示。
类  型 说  明
bool 布尔值为true或者false
flag 当该值不等于空或者false时,被认为是true
integer 整数
float 浮点数
string 文本字符串
timestamp UNIX 时间戳
array 数组
object 关联数组
query 可以是一个数值,也可以是部分参数· extend:返回所有的对象值· count:返回值的数量

当使用查询操作(get方法)时,可以使用更多的参数,查询操作支持的参数如表13-2所示。

参  数 类  型 描  述
countOutput flag 返回结果的个数,而非实际的数据
editable boolean 如果设置为true,用户可对返回的对象进行写操作。默认值为false
excludeSearch flag 返回不匹配给定参数的结果
filter object 返回过滤后的结果,参数的值可以为一个数组或者单个值,text字段不能使用此参数
limit integer 限制返回结果的数量
nodeids string/array 返回给定节点的对象信息
output query 返回对象的属性。默认值为extend
preservekeys flag 返回以ID为键的数组
search object 搜索匹配的字符串,仅用于字符和文本字段
searchByAny boolean 如果设置为true,则返回 filter 或search字段中所有的值。默认值为false
searchWildcardsEnabled boolean 如果设置为true,允许使用“*”作为搜索参数的通配符。默认值为false
sortfield string/array 对给定的参数属性进行排序
sortorder string/array 排序。ASC为升序排列;DESC为降序排列
startSearch flag 搜索以某个参数开始的结果
  1. Zabbix API代码入口文件路径
    Zabbix API代码入口文件路径如下:
    /usr/share/zabbix/api_jsonrpc.php
    API调用时的URL是http://x.x.x.x/zabbix/api_jsonrpc.php

13.3 Zabbix API的使用流程

13.3.1 使用API的基本步骤

使用API的基本步骤如下:
(1)连接http://x.x.x.x/zabbix/api_jsonrpc.php,提供用户名和密码,并标识HTTP头部Content-Type":"application/json", HTTP方法为POST。
(2)获取sessionid。
(3)通过sessionid建立后续的连接。
(4)提交POST数据,格式为JSON,按需提供参数,获取相关的数据。

13.3.2 如何使用官方文档获取帮助

使用Zabbix API需要大量地参考官方文档中列举的用法,我们先学习如何使用官方文档。例如,需要获取Host的信息,查看官方文档,地址如下:
https://www.zabbix.com/documentation/4.0/manual/api/reference/host/get
官方文档给了一个查询实例,如下所示。

{
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
        "filter": {
            "host": [
                "Zabbix server",
                "Linux server"
            ]
        }
    },
    "auth": "038e1d7b1735c6a5436ee9eae095879e",
    "id": 1
}

13.3.3 使用CURL调用API

下面我们通过Linux下的命令行工具CURL来熟悉API的使用过程。如果读者熟悉Postman等HTTP请求工具,也可以使用该工具进行数据请求,原理一样。
(1)获取sessionid,命令如下:

shell# curl -X POST     \
-H 'Content-Type:application/json' \
-d  '{"jsonrpc": "2.0", 
    "method":"user.login",
    "params":{"user":"Admin",
                "password":"zabbix"},
    "auth": null,
    "id":0 
    }'  \
http://127.0.0.1/zabbix/api_jsonrpc.php

(2)使用sessionid请求来调用API的host.get方法,命令如下:

shell# curl -X  POST  \
-H  'Content-Type: application/json'  \
-d '{"jsonrpc":"2.0", 
     "method":"host.get",
     "params":{
         "output":"extend",
         "filter":{"host":""}
     },
     "auth":"b545519b2e2f7b08e1a63b360f24b533",
     "id":1
    }' \
http://127.0.0.1/zabbix/api_jsonrpc.php

至此,我们已经学会了API的调用方法,下面我们来学习更多的例子。

13.3.4 HTTP头部Content-Type设置

HTTP头部Content-Type必须被设置为application/json;否则返回HTTP状态码为412的错误.

13.3.5 用户认证结果的返回值

认证成功的提示内容如下:

得到的结果如下:
{
    "jsonrpc":"2.0",
    "result":"b545519b2e2f7b08e1a63b360f24b533",
    "id":0
}

### 13.3.6 获取主机信息(用Python实现的示例)
```python
#!/usr/bin/env python 
#coding=utf-8 
 
#导入模块,urllib2是一个模拟浏览器HTTP方法的模块
import json
import urllib2
import sys
from urllib2 import Request, urlopen, URLError, HTTPError
 
#url and url header 
#zabbix的api 地址,用户名,密码,这里修改为自己实际的参数
zabbix_url="http://127.0.0.1/zabbix/api_jsonrpc.php" 
zabbix_header = {"Content-Type":"application/json"} 
zabbix_user   = "Admin" 
zabbix_pass   = "zabbix" 
auth_code     = ""
 
#auth user and password 
#用户认证信息的部分,最终的目的是得到一个SESSIONID
#这里是生成一个json格式的数据,用户名和密码
auth_data = json.dumps(
        {
            "jsonrpc":"2.0",
            "method":"user.login",
            "params":
                    {
                        "user":zabbix_user,
                        "password":zabbix_pass
                    },
            "id":0
        }) 
 
# create request object 
request = urllib2.Request(zabbix_url,auth_data) 
for key in zabbix_header: 
    request.add_header(key,zabbix_header[key]) 
 
#auth and get authid 
try: 
    result = urllib2.urlopen(request) 
    #对于出错新的处理
except HTTPError, e:
    print 'The server couldn\'t fulfill the request, Error code: ', e.code
except URLError, e:
    print 'We failed to reach a server.Reason: ', e.reason
else: 
    response=json.loads(result.read()) 
    result.close() 
    #判断SESSIONID是否在返回的数据中
    if  'result'  in  response:
        auth_code=response['result']
    else:
        print  response['error']['data']
  
# request json 
json_data={ 
        "method":"host.get", 
        "params":{ 
                "output": "extend",
        } 
    }
json_base={
    "jsonrpc":"2.0",
    "auth":auth_code,
    "id":1
}
json_data.update(json_base)
#用得到的SESSIONID去通过验证,获取主机的信息(用http.get方法)
if len(auth_code) == 0:
    sys.exit(1)
if len(auth_code) != 0:
    get_host_data = json.dumps(json_data) 
  
    # create request object 
    request = urllib2.Request(zabbix_url,get_host_data) 
    for key in zabbix_header: 
        request.add_header(key,zabbix_header[key]) 
  
    # get host list 
    try: 
        result = urllib2.urlopen(request) 
    except URLError as e: 
        if hasattr(e, 'reason'): 
            print 'We failed to reach a server.' 
            print 'Reason: ', e.reason 
        elif hasattr(e, 'code'): 
            print 'The server could not fulfill the request.' 
            print 'Error code: ', e.code 
    else: 
        response = json.loads(result.read()) 
        result.close() 
        
        #将所有的主机信息显示出来
        print response['result'][0]
        #显示主机的个数
        #print "Number Of Hosts: ", len(response['result']) 

13.3.7 添加主机(host.create)

添加主机的方法,请参考官方文档,地址如下:
https://www.zabbix.com/documentation/4.0/manual/api/reference/host/create
官方文档中列出了host.create的用法,如下所示。

官方文档中列出了host.create的用法,如下所示。

{'
    auth': '038e1d7b1735c6a5436ee9eae095879e',
    'id': 1,
    'jsonrpc': '2.0',
    'method': 'host.create',
    'params': {'groups': [{'groupid': '50'}],
            'host': 'Linux server[是否是:servers]'[此处需要复数],
            'interfaces': [{'dns': '',
                            'ip': '192.168.3.1',
                            'main': 1,
                            'port': '10050',
                            'type': 1,
                            'useip': 1}],
            'inventory': {'macaddress_a': '01234', 'macaddress_b': '56768'},
            'templates': [{'templateid': '20045'}]}
}

上述代码表示添加IP地址为192.168.3.1、主机名为“Linux servers”的这台主机,将其放在id为50的主机组中,引用id为20045的模板。

由于官方示例中的部分参数值并不是实际环境的参数值,所以在API中使用时需要替换为实际环境的参数值。

在MySQL数据库中查询模板id(严格地说,获取模板id也应该通过API),确保存在此id。这里选用Template OS Linux模板,通过数据库查询到其id为10001,因此host.create中的templateid参数值为10001。

下面是python的示例:

修改代码中的参数值,替换为实际参数值,如下所示。

shell# vim zabbix_api_host_create.py
{
    'method': 'host.create',
    'params': {'groups': [{'groupid': '2'}],
            'host': 'Web Linux server',
            'interfaces': [{'dns': '',
                            'ip': '192.168.8.1',
                            'main': 1,
                            'port': '10050',
                            'type': 1,
                            'useip': 1}],
            'inventory': {'macaddress_a': '01234', 'macaddress_b': '56768'},
            'templates': [{'templateid': '10001'}]}
}

运行代码,结果显示主机创建成功,hostid为10284(后续会用到)。

shell# python zabbix_api_host_create.py
{ 
    'jsonrpc': '2.0', 
    'result': {'hostids[是否多了一个s][正确]': ['10284']}, 
    'id': 1
} 

13.3.8 删除主机(host.delete)

删除主机的方法,请参考官方文档,地址如下:
https://www.zabbix.com/documentation/4.0/manual/api/reference/host/delete
官方文档给出的示例如下:

{ 
    'jsonrpc': '2.0',
    'method': 'host.delete',
    'params': [
        '13', 
        '32'
    ],
    'auth': '038e1d7b1735c6a5436ee9eae095879e',
    'id': 1
}

上述介绍表示删除hostid为13和32的两台主机。

现在,我们使用API删除上一节刚添加的hostid为10284的这台主机,将参数值修改为10284,如下所示。

shell# vim zabbix_api_host_delete.py
json_data={ 
        "method":"host.delete", 
        "params":['10284'] 
}

运行脚本,如下所示。

shell# python zabbix_api_host_delete.py
{
    u"jsonrpc": "2.0",
    u"result": {
        u"hostids": [
            u"10284"
        ]
    },
    u"id": 1
}

通过前面的学习,我们掌握了获取主机信息,以及添加、删除主机的API用法。其他更多API的用法基本都是类似的,具体请读者参考官方文档,地址如下:
https://www.zabbix.com/documentation/4.0/manual/api

13.4 第三方Zabbix API模块

官方收集的模块都是用各种语言编写的,读者可以选用自己熟悉的语言来使用现有的模块,地址如下:
https://zabbix.org/wiki/Docs/api/libraries
这里以pyzabbix为例,简单讲解其使用方法。

shell# pip  install  pyzabbix #如图13-3所示

13.5 编写命令行管理工具zbx-tool

本节我们来实现主机的命令行管理工具zbx-tool,项目地址如下:
https://github.com/zabbix-book/zbx_tool

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

  • 一、zabbix api介绍 1.Zabbix API允许以编程方式检索和修改Zabbix的配置,并提供对历史数据...
    宇晨棒棒的阅读 4,403评论 0 0
  • 用于调用Zabbix Api接入平台展示监控数据 一:接口概述(用于调用Zabbix Api接入平台展示监控数据)...
    我拿buff谢谢阅读 6,029评论 4 51
  • 作者:吴兆松(网名:itnihao) “他始终坚信,技术的积累只是时间问题,解决问题的思路和思想高于具体的技术细节...
    清汤白菜郭先生阅读 1,584评论 0 1
  • 前段时间有监控服务器主机、应用、交换机等的需求,所以对zabbix进行了学习,现在整理记录全过程。 1.zabbi...
    不好听丶阅读 803评论 0 4
  • Zabbix简介 Zabbix官方网站Zabbix中文文档 本文系统环境是CentOS7x86_64, Zabbi...
    Zhang21阅读 7,998评论 0 37