Zabbix API是基于Web的API,作为Web前端的一部分提供。它使用JSON-RPC 2.0协议,这意味着两点:
- 该API包含一组独立的方法;
- 客户端和API之间的请求和响应使用JSON格式进行编码。
传送门:Zabbix API官方文档
导入模块
在zabbix api开发中,一是爬取对应zabbix服务器内容,使用requests
模块;二是将对应的数据进行解码输出json
模块。
# -*- coding: UTF-8 -*-
# @Time : 2023-01-08 9:51
# @File : basr.py
# @Author : LockDataV
import json
import requests
当完成了前端的安装配置后,你就可以使用远程HTTP请求来调用API。为此,需要向位于前端目录中的 api_jsonrpc.php 文件发送HTTP POST请求。例如,如果你的Zabbix前端安装在 http://company.com/zabbix, 那么用HTTP请求来调用 apiinfo.version:
登录API接口封装函数
- jsonrpc - API使用的JSON-RPC协议的版本; Zabbix API实现的JSON-RPC版本是2.0;
- method -被调用的API方法名;
- params - 将被传递给API方法的参数;
- id - 请求的任意标识符;
- auth -用户认证令牌;如果没有的话可以设置为null。
def login(self):
data = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": self.user,
"password": self.password
},
"id": 1,
"auth": None
}
response = self.session.post(self.url, json=data)
self.auth = response.json()['result']
根据给定参数检索符合条件的问题
def get_problem(self):
data = {
"jsonrpc": "2.0",
"method": "problem.get",
"params": {
"output": "extend", # 返回该接口所有字段
"sortfield": ["eventid"], # 按照事件id排序
},
"auth": self.auth,
"id": 1
}
response = self.session.post(self.url, json=data)
a = response.json()
print(a)
获取主机组对象
def get_group(self):
data = {
"jsonrpc": "2.0",
"method": "hostgroup.get",
"params": {
"output": "extend",
"sortfield": ["name"],
"real_hosts": True, # 只返回包含主机的主机组(未添加主机的主机组不可见)
},
"auth": self.auth,
"id": 1
}
response = self.session.post(self.url, json=data)
a = response.json()
print(a)
获取所有主机
def get_host(self):
data = {
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": "extend",
"sortfield": ["name"],
"groupids": "4", # 指定主机组id,数组或者单个id
"selectItems": "extend",
"selectTriggers": "extend",
},
"auth": self.auth,
"id": 1
}
response = self.session.post(self.url, json=data)
a = response.json()
# print(a)
获取告警
def get_alert(self):
data = {
"jsonrpc": "2.0",
"method": "alert.get",
"params": {
"output": "extend",
"sortfield": ["clock"],
"sortorder": "DESC",
"limit": 1,
"groupids": "4", # 指定主机组id,数组或者单个id
"hostids": "10084", # 指定主机id,数组或者单个id
},
"auth": self.auth,
"id": 1
}
response = self.session.post(self.url, json=data)
a = response.json()
# print(a)
获取已经触发的触发器
def get_triggers(self):
data = {
"jsonrpc": "2.0",
"method": "trigger.get",
"params": {
"output": "extend",
"filter": {
"value": 1,
"status": 0,
"hostid": "10084", # 指定主机id
},
"sortfield": "lastchange",
"selectHosts": ["name"],
# "selectItems": ["lastvalue", "units"]
"selectItems": "extend"
},
"auth": self.auth,
"id": 1
}
response = self.session.post(self.url, json=data)
a = response.json()
# print(a)
获取指定主机
,切监控项名称包含 “System uptime” 的监控项,包括触发器
def get_item(self):
data = {
"jsonrpc": "2.0",
"method": "item.get",
"params": {
"output": "extend",
"sortfield": ["itemid"],
"groupids": "4", # 指定主机组id,数组或者单个id
"hostids": "10084", # 指定主机id,数组或者单个id
"with_triggers": True,
# "search": {
# "name": "安防设备"
# },
"tags": [
{
"tag": "设备归属",
"value": "",
"operator": "4"
}
],
# "filter": {
# "description": "安防设备",
# },
# "selectItemDiscovery": ["ts_delete"],
"selectItemDiscovery": "extend",
"selectHosts": "extend",
"selectTriggers": "extend",
"selectTags": "extend",
},
"auth": self.auth,
"id": 1
}
response = self.session.post(self.url, json=data)
a = response.json()
print(json.dumps(a, indent=4, ensure_ascii=False))
print(json.dumps(a))
函数封装
- user,对应服务器用户名;
- password,对应服务器登录密码;
- host,对应服务器主机,填写域名或IP地址;
- url,默认API访问地址
/zabbix/api_jsonrpc.php
class Zabbix:
def __init__(self, user, password):
self.user = user
self.password = password
self.session = requests.Session()
self.host = 'http://***'
self.url = self.host + '/zabbix/api_jsonrpc.php'
self.login()
函数调用
# 输入用户名和密码
zab = Zabbix(user, password)
# 调用对应的类的函数
zab.get_problem()
总结
Zabbix API封装类主要是使用.get方法来获取对应API数据。
- 获得认证密钥
- 获取zabbix所有的主机组
- 获取单个组下的所有主机
- 获取某个主机下的所有监控项
- 获取某个监控项的历史数据
- 获取某个监控项的最新数据
在实际的开发应用中,会牵涉更多的API接口,如host接口:
host.create - 创建新的主机
host.delete - 删除主机
host.get - 获取主机信息
host.massadd - 给主机添加相关对象
host.massremove - 删除主机相关对象
host.massupdate - 替换或移除主机相关对象
host.update - 更新主机
对应官方文档进行参数配置即可。