python对接API二次开发高级实战案例解析:Zabbix API封装类实现获取认证密钥、所有主机组、所有主机、所有监控项和历史数据

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: python对接API二次开发高级实战案例解析:Zabbix API封装类实现获取认证密钥、所有主机组、所有主机、所有监控项和历史数据

Zabbix API是基于Web的API,作为Web前端的一部分提供。它使用JSON-RPC 2.0协议,这意味着两点:

  • 该API包含一组独立的方法;
  • 客户端和API之间的请求和响应使用JSON格式进行编码。

传送门:Zabbix API官方文档


8e1159544def41aba448dd10534e115d.jpg


导入模块

在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. 1.获得认证密钥
  2. 2.获取zabbix所有的主机组
  3. 3.获取单个组下的所有主机
  4. 4.获取某个主机下的所有监控项
  5. 5.获取某个监控项的历史数据
  1. 6.获取某个监控项的最新数据

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

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

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

相关文章
|
5天前
|
缓存 负载均衡 Dubbo
Dubbo技术深度解析及其在Java中的实战应用
Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java分布式服务框架,它致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
24 6
|
15天前
|
存储 负载均衡 Java
Jetty技术深度解析及其在Java中的实战应用
【9月更文挑战第3天】Jetty,作为一款开源的、轻量级、高性能的Java Web服务器和Servlet容器,自1995年问世以来,凭借其卓越的性能、灵活的配置和丰富的扩展功能,在Java Web应用开发中占据了举足轻重的地位。本文将详细介绍Jetty的背景、核心功能点以及在Java中的实战应用,帮助开发者更好地理解和利用Jetty构建高效、可靠的Web服务。
30 2
|
27天前
|
开发者 图形学 Java
揭秘Unity物理引擎核心技术:从刚体动力学到关节连接,全方位教你如何在虚拟世界中重现真实物理现象——含实战代码示例与详细解析
【8月更文挑战第31天】Unity物理引擎对于游戏开发至关重要,它能够模拟真实的物理效果,如刚体运动、碰撞检测及关节连接等。通过Rigidbody和Collider组件,开发者可以轻松实现物体间的互动与碰撞。本文通过具体代码示例介绍了如何使用Unity物理引擎实现物体运动、施加力、使用关节连接以及模拟弹簧效果等功能,帮助开发者提升游戏的真实感与沉浸感。
39 1
|
27天前
|
开发者 图形学 API
从零起步,深度揭秘:运用Unity引擎及网络编程技术,一步步搭建属于你的实时多人在线对战游戏平台——详尽指南与实战代码解析,带你轻松掌握网络化游戏开发的核心要领与最佳实践路径
【8月更文挑战第31天】构建实时多人对战平台是技术与创意的结合。本文使用成熟的Unity游戏开发引擎,从零开始指导读者搭建简单的实时对战平台。内容涵盖网络架构设计、Unity网络API应用及客户端与服务器通信。首先,创建新项目并选择适合多人游戏的模板,使用推荐的网络传输层。接着,定义基本玩法,如2D多人射击游戏,创建角色预制件并添加Rigidbody2D组件。然后,引入网络身份组件以同步对象状态。通过示例代码展示玩家控制逻辑,包括移动和发射子弹功能。最后,设置服务器端逻辑,处理客户端连接和断开。本文帮助读者掌握构建Unity多人对战平台的核心知识,为进一步开发打下基础。
61 0
|
27天前
|
开发者 图形学 C#
揭秘游戏沉浸感的秘密武器:深度解析Unity中的音频设计技巧,从背景音乐到动态音效,全面提升你的游戏氛围艺术——附实战代码示例与应用场景指导
【8月更文挑战第31天】音频设计在游戏开发中至关重要,不仅能增强沉浸感,还能传递信息,构建氛围。Unity作为跨平台游戏引擎,提供了丰富的音频处理功能,助力开发者轻松实现复杂音效。本文将探讨如何利用Unity的音频设计提升游戏氛围,并通过具体示例代码展示实现过程。例如,在恐怖游戏中,阴森的背景音乐和突然的脚步声能增加紧张感;在休闲游戏中,轻快的旋律则让玩家感到愉悦。
41 0
|
29天前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
1月前
|
存储 NoSQL Redis
redis 6源码解析之 object
redis 6源码解析之 object
56 6
|
14天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
18天前
|
开发工具
Flutter-AnimatedWidget组件源码解析
Flutter-AnimatedWidget组件源码解析
|
14天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
159 37