Zabbix API 简介
Zabbix API 开始扮演着越来越重要的角色,尤其是在集成第三方软件和自动化日常任务时。 很难想象管理数千台服务器而没有自动化是多么的困难。 Zabbix API 为批量操作、第三方软件集成以及其他作用提供可编程接口。 Zabbix API 是在 1.8 版本中开始引进并且已经被广泛应用。所有的 Zabbix 移动客户端都是基于 API, 甚至原生的 WEB 前端部分也是建立在它之上。 Zabbix API 中间件使得架构更加模块化也避免直接对数据库进行操作。 它允许你通过 JSON RPC 协议来创建、更新和获取 Zabbix 对象并且做任何你喜欢的操作【当然前提是你拥有认证账户】。 Zabbix API 提供两项主要功能: 1. 远程管理 Zabbix 配置 2. 远程检索配置和历史数据 使用 JSON API 采用 JSON-RPC 实现。这意味着调用任何函数,都需要发送 POST 请求,输入输出数据都是以 JSON 格式。
Zabbix API 的使用流程
使用 API 的基本步骤
1. 连接 http://x.x.x.x/api_jsonrpc.php 提供用户名和密码,
并标识 HTTP 头部 Content-Type:application/json,HTTP 方法为 POST。2. 获取 SESSIONID
3. 通过 SESSIONID 建立后续的连接
4. 提交 POST 数据,格式为 JSON,其中放对应的方法,获取需要的数据。
3、格式及参数说明
zabbix-api的json格式主要包括以下内容:
jsonrpc - API使用的JSON-RPC协议的版本; Zabbix API实现JSON-RPC版本2.0;
method - 调用的API方法;
params - 将被传递给API方法的参数;
auth -用户认证令牌;
id - 请求的任意标识符;
zabbix表结构
hosts主要表结构和各字段的意思
hostid 主机ID/模版ID readonly
proxy_hostid 代理主机ID,即这台主机通过该代理主机去监控
host 主机名,监控agent端ID字段
status 主机状态
0 已启用,监视这台主机
1 停用的,不监视这台主机
3 模版
5 主动模式 创建代理时使用
6 被动模式 创建代理时使用
available 客户端agent主机是否可用 readonly
0 未知或模版
1 可用
2 不可用
description 描述主机
disable_until 下一次轮询一个不可用主机的时间,默认只读readonly
ipmi_authtype 认证算法
-1 默认
0 无
1 MD2
2 MD5
4 Straight
5 OEM
6 RMCP+
ipmi_privilege 特权级别
1 回调
2 用户 默认
3 操作者
4 管理者
5 OEM
ipmi_available 可用的ipmiagent
0 未知
1 可用
2 不可用
ipmi_disable_until ipmi不可用时下一次的轮询时间
ipmi_error ipmi不可用的错误信息
ipmi_errors_from ipmi不可用状态从什么时候开始
ipmi_password ipmi 密码
ipmi_username ipmi用户名
jmx_available 可用的jmxagent
0 未知
1 可用
2 不可用
jmx_disable_until 当jmx不可用时下一次轮询当时间
jmx_error jmx不可用错误信息
jmx_errors_from jmx 不可用状态开始时间
maintenance_from 资产维护开始时间
maintenance_status 生效当状态
0 不维护
1 维护生效
maintenance_type 生效维护的类型
0 通过数据收集维护 默认
1 非数据收集维护
maintenanceid 维护的ID,如果当前主机处于维护状态,否则为null
snmp_available snmp是否可用
0 未知
1 可用
2 不可用
snmp_disable_until 当snmp不可用时下一次轮询时间
snmp_error 不可用时错误信息
snmp_errors_from 错误开始时间
error 当agent不可用时显示当错误信息
error_from 故障时间 当agent不可用时开始的时间
name 主机显示的名称,即可见名称,默认是用host字段是值填充
flags 主机来源
0 表示普通的主机
4 表示自动发现的主机
inventory_mode 主机资产类型
-1 禁用
0 手动,默认值
自动
监控项items
itemid 监控项ID
type 监控项类型
0 Zabbix 客户端,
1 SNMPv1 客户端,
2 Zabbix采集器,
3 简单检查,
4 SNMPv2 客户端,
5 Zabbix内部,
6 SNMPv3 客户端,
7 Zabbix客户端(主动式),
8 Zabbix整合,
10 外部检查,
11 数据库监控,
12 IPMI客户端,
13 SSH 客户端,
14 TELNET客户端,
15 可计算的,
16 JMX agent代理程序,
17 SNMP trap
hostid 关联主机ID
name 监控项名称
key_ 监控项key值
delay 间隔/秒
history 历史数据保留时间/天
trends 趋势数据保留时间/天 默认365天
status 监控项启用状态
0 启用
1 禁用
value_type 数据类型,对应的存放历史数据表
0 history表 numeric float
1 history_str表 character
2 history_log表 log
3 history_uint表 numeric unsigned
4 history_text表 text
authtype ssh认证方法,只有通过ssh代理方式时使用
0 密码
1 public key
units 数据类型单位
data_type 数据类型
0 decimal 十进制
1 octal 八进制
2 hexadecimal 十六进制
3 boolean 布尔
delay_flex 自定义间隔
delta 存储的值
0 (default) as is
1 Delta, speed per second
2 Delta, simple change
error 如果监控项有问题会自动更新这个错误信息 readonly
history 监控项保持的历史数据时长,默认90天,单位天
formula 公式,自定义乘数
1 默认值
lastclock 监控项最后一次更新时间
logtimefmt 格式化日志时间
templateid 监控项对应的父模版ID,该ID自关联,模版对应的为hostid相当于模版分组
flags 监控项来源
0 普通
4 自动发现
interfaceid 网卡IP,对应interface表interfaceid
params 额外的参数类型取决于监控项
针对ssh和telnet监控项 执行脚本
数据库监控项 执行sql
计算类型 执行公式
port 针对snmp监控项,端口监控
password 密码认证,针对简单检查,ssh,telnet,数据库监视,jmx监控项
description 监控项描述信息
state 该监控项是否适用
0 支持
1不支持
用 curl 模拟 API 的使用
# 1. 获取 SESSIONID
[root@linux-node1 ~]# curl -s -X POST -H 'Content-Type:application/json' -d ' > { > "jsonrpc": "2.0", > "method": "user.login", > "params": { > "user": "Admin", > "password": "zabbix" > }, > "id": 1 > }' http://192.168.56.11/zabbix/api_jsonrpc.php | python -m json.tool { "id": 1, "jsonrpc": "2.0", "result": "6a0d235908c25a495f0d356157fbb3d3" } # 2. 用获取的 SESSIONID 去调用 API 的 host.get 方法请求 hostid [root@linux-node1 ~]# curl -s -X POST -H 'Content-Type:application/json' -d ' > { > "jsonrpc": "2.0", > "method": "host.get", > "params": { > "output": ["hostid"] > }, > "auth": "6a0d235908c25a495f0d356157fbb3d3", > "id": 1 > }' http://192.168.56.11/zabbix/api_jsonrpc.php | python -m json.tool { "id": 1, "jsonrpc": "2.0", "result": [ { "hostid": "10084" }, { "hostid": "10120" } ] }
可以通过 API 来添加和删除 Host,这里就不举例了,具体方法参考官网文档。
在实际的 API 开发应用中,我们可以采用 Python 等其他编程语言中来实现。 如下,就是用 Python 写的用于认证获取 SESSIONID 的代码例子:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
import json url = 'http://192.168.56.11/zabbix/api_jsonrpc.php' post_data = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "zabbix" }, "id": 1 } post_header = {'Content-Type': 'application/json'} ret = requests.post(url, data=json.dumps(post_data), headers=post_header) zabbix_ret = json.loads(ret.text) if not zabbix_ret.has_key('result'): print 'login error' else: print zabbix_ret.get('result')
执行脚本时,注意要安装 Python requests 模块。
[root@linux-node1 ~]# python zabbix_auth.py
Traceback (most recent call last):
File "zabbix_auth.py", line 4, in <module> import requests ImportError: No module named requests [root@linux-node1 ~]# yum install python-pip -y [root@linux-node1 ~]# pip install requests [root@linux-node1 ~]# python zabbix_auth.py f2453c4cc730d5158a87e0754940138e
调用Zabbix api使用的是HTTP的POST请求方式
其中请求的头部为:
{"Content-Type": "application/json-rpc"}
{"Content-Type": "application/json-rpc"}
请求的URL为:
http://zabbix.aek.com/api_jsonrpc.php
http://zabbix.aek.com/api_jsonrpc.php
如果url中包含目录需要把目录写上,如http://zabbix.aek.com/zabbix/api_jsonrpc.php,最后就是请求的数据(data),比如获取Token,创建主机,获取主机ID,获取模板ID,获取组ID,删除主机等。
接下以以Python调用 API为例,例出用法案例:
测试连接是否成功
#!/usr/bin/python
#coding:utf:8
import requests
import json url = "http://zabbix.aek.com/zabbix/api_jsonrpc.php" header = {"Content-Type": "application/json-rpc"} data = {"jsonrpc":"2.0","method":"apiinfo.version","id":1,"auth":None,"params":{}} request = requests.post(url=url, headers=header, data=json.dumps(data)) print(request.content)
#!/usr/bin/python
#coding:utf:8
import requests
import json url = "http://zabbix.aek.com/zabbix/api_jsonrpc.php" header = {"Content-Type": "application/json-rpc"} data = {"jsonrpc":"2.0","method":"apiinfo.version","id":1,"auth":None,"params":{}} request = requests.post(url=url, headers=header, data=json.dumps(data)) print(request.content)
上面的data用来测试是否可连接成功,官方文档中auth的值为null,但在python中null用None表示,所以需要改成None。
成功后返回值大概如下:会显示zabbix版本
{"jsonrpc":"2.0","result":"3.2.3","id":1}
{"jsonrpc":"2.0","result":"3.2.3","id":1}
获取Token
#!/usr/bin/python
#coding:utf:8
import requests
import json url = "http://zabbix.aek.com/zabbix/api_jsonrpc.php" header = {"Content-Type": "application/json-rpc"} data = {"jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "zabbix" }, "id": 1, "auth": None } request = requests.post(url=url, headers=header, data=json.dumps(data)) print(request.content)
#!/usr/bin/python
#coding:utf:8
import requests
import json url = "http://zabbix.aek.com/zabbix/api_jsonrpc.php" header = {"Content-Type": "application/json-rpc"} data = {"jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "zabbix" }, "id": 1, "auth": None } request = requests.post(url=url, headers=header, data=json.dumps(data)) print(request.content)
成功后返回值如下:会返回一个Token
{"jsonrpc":"2.0","result":"391277f070a3ebc5b2afe9cf466cb74c","id":1}
{"jsonrpc":"2.0","result":"391277f070a3ebc5b2afe9cf466cb74c","id":1}
最后以一个完整的Python脚本通过zabbix API获取所有主机的信息为例:
#!/usr/bin/python
#coding:utf:8
import requests
import json class Zabbix: def __init__(self, url, header, username, password): self.url = url self.header = header self.username = username self.password = password def getToken(self): #获取Token并返回字符Token字符串 data = {"jsonrpc": "2.0", "method": "user.login", "params": { "user": self.username, "password": self.password }, "id": 1, "auth": None } token = requests.post(url=self.url, headers=self.header, data=json.dumps(data)) return json.loads(token.content)["result"] def getAllHost(self): #获取所有主机信息 data = {"jsonrpc": "2.0", "method": "host.get", "params": { "output": [ "hostid", "host", ], "selectGroups": "extend", "selectInterfaces": [ "interfaceid", "ip" ] }, "id": 2, "auth": self.getToken() } hosts = requests.post(url=self.url, headers=self.header, data=json.dumps(data)) return json.loads(hosts.content)["result"] if __name__ == "__main__": header = {"Content-Type": "application/json-rpc"} url="http://zabbix.aek.com/zabbix/api_jsonrpc.php" test = Zabbix(url=url, header=header, username="Admin", password="zabbix") print(test.getAllHost())
#!/usr/bin/python
#coding:utf:8
import requests
import json class Zabbix: def __init__(self, url, header, username, password): self.url = url self.header = header self.username = username self.password = password def getToken(self): #获取Token并返回字符Token字符串 data = {"jsonrpc": "2.0", "method": "user.login", "params": { "user": self.username, "password": self.password }, "id": 1, "auth": None } token = requests.post(url=self.url, headers=self.header, data=json.dumps(data)) return json.loads(token.content)["result"] def getAllHost(self): #获取所有主机信息 data = {"jsonrpc": "2.0", "method": "host.get", "params": { "output": [ "hostid", "host", ], "selectGroups": "extend", "selectInterfaces": [ "interfaceid", "ip" ] }, "id": 2, "auth": self.getToken() } hosts = requests.post(url=self.url, headers=self.header, data=json.dumps(data)) return json.loads(hosts.content)["result"] if __name__ == "__main__": header = {"Content-Type": "application/json-rpc"} url="http://zabbix.aek.com/zabbix/api_jsonrpc.php" test = Zabbix(url=url, header=header, username="Admin", password="zabbix") print(test.getAllHost())
通过以上的学习相信大家对Zabbix API已经有一个初步的认识,后面将会通过API去完成主机的自动添加,自动化报表等使用
python3(requests)调用zabbix-4.2.3-api添加修改主机
自动化是需求,手动太慢,自动发现没玩过。用的比较多的就是调API来操作。
zabbix版本为4.2.3 python3 需要reuquests,json模块
下面是代码,只写了添加和删除的功能,有需求的可以自己加一下
'''
2019.6.19
zabbix API 修改主机
'''
import json,requests
headers={"Content-Type":"application/json"}
url = 'http://www.zabbix.com/zabbix/api_jsonrpc.php'
def getAuth(user,password):
try:
global headers, url
data = json.dumps({
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": user,
"password": password
},
"id": 1,
})
res = requests.post(url,data=data,headers=headers)
auth = res.json().get('result','')
return auth
except Exception as err:
pass
def getHost(auth):
try:
global headers,url
data = json.dumps({
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": [
"hostid",
"host"],
"selectInterfaces": [
"interfaceid",
"ip"]},
"id": 2,
"auth": auth
})
res = requests.post(url,data=data,headers=headers)
host = res.json()
return host
except:
pass
def getGroupid(auth,groupname):
try:
global headers, url
data = json.dumps({
"jsonrpc": "2.0",
"method": "hostgroup.get",
"params": {
"output": "extend",
"filter": {
"name": [groupname]}},
"auth": auth,
"id": 1
})
res = requests.post(url,data=data,headers=headers)
groupid = res.json()['result'][0]['groupid']
return groupid
except:
pass
def getTempid(auth,tempname):
try:
global headers, url
# print(templist)
data = json.dumps(
{
"jsonrpc": "2.0",
"method": "template.get",
"params": {
"output": "extend",
"filter": {
"host": tempname}},
"auth": auth,
"id": 1}
)
res = requests.post(url,data=data,headers=headers)
tempid = []
for i in range(len(res.json()['result'])):
id = res.json(