目录
前言
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与第三方软件集成;自动执行常规任务。
- 客户端和API之间的请求和响应使用JSON格式进行编码。
- 大多数API至少包含四种方法: get, create, update 和 delete。
- 完成前端的安装配置后,可以使用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 | 把主机添加到目标组。主机组必须已定义 | 需要找到指定主机组名的 |
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指定连接的模板 |
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))
运行前监控主机列表:
运行输出:
创建成功,返回hostids:10542,在web界面上也能看到新添加的主机。
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的使用,希望能够对大家有所帮助。