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方法的参数;
- d - 请求的任意标识符;
- 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数据。
- 1.获得认证密钥
- 2.获取zabbix所有的主机组
- 3.获取单个组下的所有主机
- 4.获取某个主机下的所有监控项
- 5.获取某个监控项的历史数据
- 6.获取某个监控项的最新数据
在实际的开发应用中,会牵涉更多的API接口,如host接口:
host.create - 创建新的主机 host.delete - 删除主机 host.get - 获取主机信息 host.massadd - 给主机添加相关对象 host.massremove - 删除主机相关对象 host.massupdate - 替换或移除主机相关对象 host.update - 更新主机
对应官方文档进行参数配置即可。