最近有个想法:想作一个zabbix数据的二次呈现,因此来写一下Zabbix的api的内容。php
先说下zabbix api的认证基础。前端
Zabbix API开始扮演着愈来愈重要的角色,尤为是在集成第三方软件和自动化平常任务时。。Zabbix API为批量操做、第三方软件集成以及其余做用提供可编程接口。python
Zabbix API是在1.8版本中开始引进而且已经被普遍应用。全部的Zabbix移动客户端都是基于API,甚至原生的WEB前端部分也是创建在它之上。Zabbix API 中间件使得架构更加模块化也避免直接对数据库进行操做。它容许你经过JSON
RPC协议来建立、更新和获取Zabbix对象而且作任何你喜欢的操做。数据库
Zabbix API提供两项主要功能:编程
使用JSONjson
API 采用JSON-RPC实现。这意味着调用任何函数,都须要发送POST请求,输入输出数据都是以JSON格式。大体工做流以下:api
准备JSON对象,它描述了你想要作什么(建立主机,获取图像,更新监控项等)。安全
采用POST方法向 http://example.com/zabbix/api_jsonrpc.php发送此JSON对象,http://example.com/zabbix/是Zabbix前端地址 ,api_jsonrpc.php是调用API的PHP脚本。可在安装可视化前端的目录下找到。架构
获取JSON格式响应。app
注:请求除了必须是POST方法以外,HTTP Header Content-Type必须为【application/jsonrequest,application/json-rpc,application/json】其中之一。
能够采用脚本或者任何"手动"支持JSON RPC的工具来使用API。而首先须要了解的就是如何验证和如何使用验证ID来获取想要的信息。后面的演示会以Python脚本和基于Curl的例子来呈现API的基本使用。
基本请求格式
Zabbix API 简化的JSON请求以下:
1 { 2 "jsonrpc": "2.0", 3 "method": "method.name", 4 "params": { 5 "param_1_name": "param_1_value", 6 "param_2_name": "param_2_value" 7 }, 8 "id": 1, 9 "auth": "159121b60d19a9b4b55d49e30cf12b81", 10 }
下面一行一行来看:
"jsonrpc": "2.0"-这是标准的JSON RPC参数以标示协议版本。全部的请求都会保持不变。
"method": "method.name"-这个参数定义了真实执行的操做。例如:host.create、item.update等等
"params"-这里经过传递JSON对象来做为特定方法的参数。若是你但愿建立监控项,"name"和"key_"参数是须要的,每一个方法须要的参数在Zabbix API文档中都有描述。
"id": 1-这个字段用于绑定JSON请求和响应。响应会跟请求有相同的"id"。在一次性发送多个请求时颇有用,这些也不须要惟一或者连续
"auth": "159121b60d19a9b4b55d49e30cf12b81"-这是一个认证令牌【authentication token】用以鉴别用户、访问API。这也是使用API进行相关操做的前提-获取认证ID。
Zabbix API是基于JSON-RPC 2.0规格,具体实现能够选择任何你喜欢的编程语言或者手动方式。这里咱们采用的Python和基于Curl的方式来作示例。Python 2.7版本已经支持JSON,因此再也不须要其余模块组件。固然能够采用Perl、Ruby、PHP之类的语言,使用前先确保相应JSON模块的安装。
任何Zabbix API客户端在真正工做以前都须要验证它自身。在这里是采用User.login方法。这个方法接受一个用户名和密码做为参数并返回验证ID,一个安全哈希串用于持续的API调用(在使用User.logout以前该验证ID均有效)。
1. user.login方法获取zabbix server的认证结果官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/user/login
python脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
[iyunv@yang python]# cat auth.py #!/usr/bin/env python2.7 #coding=utf-8 import json import urllib2 # based url and required header url = "http://1.1.1.1/zabbix/api_jsonrpc.php" header = {"Content-Type":"application/json"} # auth user and password data = json.dumps( { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "zabbix" }, "id": 0 }) # create request object request = urllib2.Request(url,data) for key in header: request.add_header(key,header[key]) # auth and get authid try: result = urllib2.urlopen(request) except URLError as e: print "Auth Failed, Please Check Your Name AndPassword:",e.code else: response = json.loads(result.read()) result.close() print"Auth Successful. The Auth ID Is:",response['result'] |
python脚本运行结果:
1 2 |
[iyunv@yang python]# python auth.py Auth Successful. The Auth ID Is: a0b82aae0842c2041386a61945af1180 |
curl命令:
1 2 3 |
curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc": "2.0","method":"user.login","params":{"user":"admin","password":"zabbix"},"auth": null,"id":0}' http://1.1.1.1/zabbix/api_jsonrpc.php |
curl命令运行结果:
1 |
{"jsonrpc":"2.0","result":"b895ce91ba84fe247e444817c6773cc3","id":0} |
比较来看,采用脚本能够有更多的灵活性,而基于CURL的方式,对结果的处理不是很方便。原理则都是相通的。
除了这些获取信息之外,采用API调用一样能够进行建立操做,更新操做和删除操做等等。这也很容易让咱们联想起数据库操做,固然比较这些采用API
调用获取结果的方式,也不能忘掉这种最直接而危险的方式。在开始讨论中已经提到,Zabbix如今自带的前端实现部分是采用数据库操做,部分是基于API
调用。
下面的流程图表明了Zabbix API
工做的典型工做流。验证(方法user.login)是获取验证ID的强制步骤。这个ID又容许咱们调用API提供的任何权限容许的方法来进行操做。在之
前的例子中没有提到user.logout方法,这也是一次验证ID可以重复使用的缘由所在。使用user.logout方法后将会使验证ID失效,后面
的操做将不能再使用此ID。