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数据。

  1. 获得认证密钥
  2. 获取zabbix所有的主机组
  3. 获取单个组下的所有主机
  4. 获取某个主机下的所有监控项
  5. 获取某个监控项的历史数据
  6. 获取某个监控项的最新数据

在实际的开发应用中,会牵涉更多的API接口,如host接口:

host.create - 创建新的主机
host.delete - 删除主机
host.get - 获取主机信息
host.massadd - 给主机添加相关对象
host.massremove - 删除主机相关对象
host.massupdate - 替换或移除主机相关对象
host.update - 更新主机

对应官方文档进行参数配置即可。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐