目录

前言

1、Zabbix API

3、获取tokens

4、实例

4.1获取主机组ID

4.2 获取监控模板ID

4.3 创建主机

4.4 验证

4.5 获取监控历史数据

 总结

前言

        近期学习网络运维监控方面的知识,在使用Zabbix系统中遇到了许多的问题,在查找资料过程中,发现有些资料比较的老,还有一些缺少关键的步骤,让本小白走了诸多弯路。

        这里记录自己学习Zabbix的过程,一是作为自己的笔记备查,二也为其他有需要的人提供帮助。


1、Zabbix API

Zabbix API允许你以编程方式检索和修改Zabbix的配置,并提供对历史数据的访问。它广泛用于:创建新的应用程序以使用Zabbix; 将Zabbix与第三方软件集成;自动执行常规任务。

  1. 客户端和API之间的请求和响应使用JSON格式进行编码。
  2. 大多数API至少包含四种方法: get, create, update 和 delete。
  3. 完成前端的安装配置后,可以使用HTTP请求来调用API。

使用Python编程实现一些常用的功能来介绍API的常用结构。

下面是编程用的库

# -*- coding: utf-8 -*-
"""
Created on Tue Dec  6 17:35:38 2022
@author: YLB
"""
import requests
import json
#import datetime
#常用的参数
url = 'http://192.168.217.133/zabbix/api_jsonrpc.php'    #API接口
header = {'Content-Type': 'application/json-rpc'}        #requests的headers参数
user  = 'Admin'                          #用户名
passwords = 'zabbix'                      #密码

用requests.post提交参数,返回结果,如果返回正确的话,会返回一个含有result字段的json数据,如果错误,返回含有error字段的json数据,这里进行一下判断。

#request函数,每个函数都调用do_request,返回json()["result"]
def do_request(data):
    try:
        request = requests.post(url=url, headers=header, data=json.dumps(data), timeout=60)
        if 'result' in request.json():#正确的,返回result
            return request.json()["result"]
        if 'error' in request.json():#如果出现错误,防护错误的代码,以及剪短的错误提示
            return request.json()["error"]

    except requests.ConnectionError:
        return None
    else:
        return None

3、获取tokens

用user.login方法,获取tokens,主要就是配置params,详细可以从zabbix手册获取,主要的参数就是用户名和密码,auth因为没有获取,所以是None。

#登录,获取token
def get_token():
        params = {
                  "jsonrpc": "2.0",
                  "method": "user.login",
                  "params": {
                      "user": user,          
                      "password": passwords
                  },
                  "id": 1,
                  "auth": None
              } 
        tokens = do_request(params)
        if not tokens:
             print("登录失败")
        return tokens

4、实例

下面通过一个添加一个被监控主机的实例,来回更加详细的介绍API的使用。

目标,将IP地址为192.168.217.140,端口为10050的主机进行监控,名称为CentOS_7,监控模板:Linux by Zabbix Agent,群组:Linux servers,并读取监控到的Available memory in %数值。

创建主机在手册创建 (zabbix.com) ,需要用的参数:

参数

类型

描述

需要关注的内容

groups
(必选)

object/array

把主机添加到目标。主机组必须已定义 groupid 属性。

需要找到指定主机组名的groupid

interfaces

object/array

为主机创建的接口

必选参数:

Dns接口使用的DNS名称,如果通过IP直接连接,则可以为空。

Hostid接口所属的主机ID,创建时自动生成。

Ip:主机的IP

Main该接口是否在主机上用作默认的接口,在主机上只能将某种类型的一个接口设置为默认值。0 - 不是默认; 1 - 默认。

Port接口使用的端口号,可以包含用户宏。

Type接口类型。1 - agent; 2 - SNMP; 3 - IPMI; 4 - JMX。

Useip是否通过IP进行连接。0 - 使用主机DNS进行连接; 1 - 使用主机接口的主机IP进行连接。

tags

object/array

主机标签

监控主机的标签,可以不配置

templates

object/array

主机连接的模板。模板必须已定义templateid属性。

通过templateid指定连接的模板

macros

object/array

为主机创建的用户宏

未研究,本次没有涉及

inventory

object

主机资产清单属性。

未研究,本次没有涉及

根据上面分析,创建主机,需要群组名的groupid和模板的templateid。

4.1获取主机组ID

获取主机组groupid的方法为hostgroup.get,在手册的获取 (zabbix.com)中。

#获取主机组的Id,输入的主机组的名称
def get_hostgroup(hostgroup_name):
    params= {
            "jsonrpc": "2.0",
            "method": "hostgroup.get",
            "params": {
                    "output": "groupid",
                    "filter": {
                         "name": hostgroup_name
                               }
                    },
            "auth": get_token(),
            "id": 5
        }
    resp = do_request(params)
    if not resp:
         print("获取失败")
    return resp

4.2 获取监控模板ID

获取模板的ID的用template.get方法,参考手册检索模板 (zabbix.com),通过指定host的名字,返回templateid等指标。通过过滤器,返回指定群组名的ID。

#获取指定名称的监控模板的ID,参数 监控模板的名称
def template_get(host_name):
        params= {
                "jsonrpc": "2.0",
                 "method": "template.get",
                 "params": {
                       "output":[ "templateid","host"],
                       "filter": {
                           "host": 
                               host_name
                       }
                   },
                "auth":get_token(),
                "id":4,
            }
        resp = do_request(params)
        if not resp:
             print("获取失败")
        return resp

4.3 创建主机

有了上述参数,便可以采用host.create方法创建一个主机,参考手册方法创建 (zabbix.com)

对IP地址为192.168.217.140,端口为10050的主机进行监控,名称为CentOS_7,监控模板:Linux by Zabbix Agent,群组:Linux servers。

#创建监控主机,输入host_name,host_ip,host_port,group_id,template_id
def host_creat(host_name,host_ip,host_port,group_id,template_id):
        params= {
            "jsonrpc": "2.0",
            "method": "host.create",
            "params": {
                "host":host_name,
                "interfaces": [
                    {
                        "type": 1,
                        "main": 1,
                        "useip": 1,
                        "ip":host_ip,
                        "dns": "",
                        "port":host_port
                                            }
                    ],
                "groups":[
                    {
                        "groupid":group_id
                        }
                    ],
                "templates": [
                    {
                        "templateid":template_id
                   }
                    ]
            },
            "id": 7,
            "auth": get_token()
        }
        resp = do_request(params)
        if not resp:
            print("获取失败")
        return resp

4.4 验证

调用上述函数进行创建:

host_name ='CentOS_7_linux'
host_ip ='192.168.217.140'
host_port ='10050'
template ="Linux by Zabbix agent"
group ='Linux servers'
group_id=get_hostgroup(group)[0]['groupid']
template_id=template_get(template)[0]['templateid']
print(host_creat(host_name,host_ip,host_port,group_id,template_id))

运行前监控主机列表: 

zabbix 的api接口在哪 zabbix api文档_python

运行输出:

zabbix 的api接口在哪 zabbix api文档_zabbix_02

创建成功,返回hostids:10542,在web界面上也能看到新添加的主机。

zabbix 的api接口在哪 zabbix api文档_zabbix_03

4.5 获取监控历史数据

下面我们用一个脚本查看新增加的主机的一个监控参数Available memory in %最新的10个监控值。

获取监控的历史数据用到的方法是history.get,参考手册的查询历史数据 (zabbix.com)。输入是itemids,因此需要通过Available memory in %查找到对应的itemids,采用的方法是item.get,参考手册的获取 (zabbix.com),该方法可以通过主机的hostid及关键字进行查询。

方法如下:

#获取指定hostids的监控项items,参数 hostid
def get_item(hostid):
        params= {
                "jsonrpc":"2.0",
                "method":"item.get",
                "params":{
                    "output":["itemids","name"],
                    "hostids":hostid,
                     "search": {
                        "name": "Available memory in %"
                        }
                    },
                "auth":get_token(),
                "id":4,
            }
        resp = do_request(params)
        if not resp:
             print("获取失败")
        return resp
        

#获取指定itemid的最新的limit个历史记录
def get_history(itemid,limit):
        
        params = {
                  "jsonrpc": "2.0",
                  "method": "history.get",
                  "params": {
                      "output": "extend",
                      "history": 0,
                      "itemids": itemid,
                      "sortfield": "clock",
                      "sortorder": "DESC",
                      "limit": limit
                  },
                  "id": 3,
                  "auth":get_token()
              } 
        resp = do_request(params)
        if not resp:
             print("获取失败")
        return resp

调用方法,

item_id=get_item("10542")[0]['itemid']
print(get_history(item_id,10))

 获取如下数据

zabbix 的api接口在哪 zabbix api文档_zabbix 的api接口在哪_04


总结

本文介绍了Zabbix的API的使用,希望能够对大家有所帮助。