018-zabbix_api

Zabbix API 简介

Zabbix API 开始扮演着越来越重要的角色,尤其是在集成第三方软件和自动化日常任务时。
很难想象管理数千台服务器而没有自动化是多么的困难。
Zabbix API 为批量操作、第三方软件集成以及其他作用提供可编程接口。

Zabbix API 是在 1.8 版本中开始引进并且已经被广泛应用。所有的 Zabbix 移动客户端都是基于 API,
甚至原生的 WEB 前端部分也是建立在它之上。
Zabbix API 中间件使得架构更加模块化也避免直接对数据库进行操作。
它允许你通过 JSON RPC 协议来创建、更新和获取 Zabbix 对象并且做任何你喜欢的操作【当然前提是你拥有认证账户】。

Zabbix API 提供两项主要功能:

1. 远程管理 Zabbix 配置
2. 远程检索配置和历史数据

使用 JSON
API 采用 JSON-RPC 实现。这意味着调用任何函数,都需要发送 POST 请求,输入输出数据都是以 JSON 格式。

Zabbix API 的使用流程

使用 API 的基本步骤

  1. 连接 http://x.x.x.x/api_jsonrpc.php 提供用户名和密码,
    并标识 HTTP 头部 Content-Type:application/json,HTTP 方法为 POST。
  2. 获取 SESSIONID
  3. 通过 SESSIONID 建立后续的连接
  4. 提交 POST 数据,格式为 JSON,其中放对应的方法,获取需要的数据。

3、格式及参数说明

zabbix-api的json格式主要包括以下内容:

jsonrpc - API使用的JSON-RPC协议的版本; Zabbix API实现JSON-RPC版本2.0;

method - 调用的API方法;

params - 将被传递给API方法的参数;

auth -用户认证令牌;

id - 请求的任意标识符;

zabbix表结构

hosts主要表结构和各字段的意思

hostid 主机ID/模版ID readonly

proxy_hostid 代理主机ID,即这台主机通过该代理主机去监控

host 主机名,监控agent端ID字段

status 主机状态

0 已启用,监视这台主机

1 停用的,不监视这台主机

3 模版

5 主动模式 创建代理时使用

6 被动模式 创建代理时使用

available 客户端agent主机是否可用 readonly

0 未知或模版

1 可用

2 不可用

description 描述主机

disable_until 下一次轮询一个不可用主机的时间,默认只读readonly

ipmi_authtype 认证算法

-1 默认

0 无

1 MD2

2 MD5

4 Straight

5 OEM

6 RMCP+

ipmi_privilege 特权级别

1 回调

2 用户 默认

3 操作者

4 管理者

5 OEM

ipmi_available 可用的ipmiagent

0 未知

1 可用

2 不可用

ipmi_disable_until ipmi不可用时下一次的轮询时间

ipmi_error ipmi不可用的错误信息

ipmi_errors_from ipmi不可用状态从什么时候开始

ipmi_password ipmi 密码

ipmi_username ipmi用户名

jmx_available 可用的jmxagent

0 未知

1 可用

2 不可用

jmx_disable_until 当jmx不可用时下一次轮询当时间

jmx_error jmx不可用错误信息

jmx_errors_from jmx 不可用状态开始时间

maintenance_from 资产维护开始时间

maintenance_status 生效当状态

0 不维护

1 维护生效

maintenance_type 生效维护的类型

0 通过数据收集维护 默认

1 非数据收集维护

maintenanceid 维护的ID,如果当前主机处于维护状态,否则为null

snmp_available snmp是否可用

0 未知

1 可用

2 不可用

snmp_disable_until 当snmp不可用时下一次轮询时间

snmp_error 不可用时错误信息

snmp_errors_from 错误开始时间

error 当agent不可用时显示当错误信息

error_from 故障时间 当agent不可用时开始的时间

name 主机显示的名称,即可见名称,默认是用host字段是值填充

flags 主机来源

0 表示普通的主机

4 表示自动发现的主机

inventory_mode 主机资产类型

-1 禁用

0 手动,默认值

自动

监控项items

itemid 监控项ID

type 监控项类型

0 Zabbix 客户端,

1 SNMPv1 客户端,

2 Zabbix采集器,

3 简单检查,

4 SNMPv2 客户端,

5 Zabbix内部,

6 SNMPv3 客户端,

7 Zabbix客户端(主动式),

8 Zabbix整合,

10 外部检查,

11 数据库监控,

12 IPMI客户端,

13 SSH 客户端,

14 TELNET客户端,

15 可计算的,

16 JMX agent代理程序,

17 SNMP trap

hostid 关联主机ID

name 监控项名称

key_ 监控项key值

delay 间隔/秒

history 历史数据保留时间/天

trends 趋势数据保留时间/天 默认365天

status 监控项启用状态

0 启用

1 禁用

value_type 数据类型,对应的存放历史数据表

0 history表 numeric float

1 history_str表 character

2 history_log表 log

3 history_uint表 numeric unsigned

4 history_text表 text

authtype ssh认证方法,只有通过ssh代理方式时使用

0 密码

1 public key

units 数据类型单位

data_type 数据类型

0 decimal 十进制

1 octal 八进制

2 hexadecimal 十六进制

3 boolean 布尔

delay_flex 自定义间隔

delta 存储的值

0 (default) as is

1 Delta, speed per second

2 Delta, simple change

error 如果监控项有问题会自动更新这个错误信息 readonly

history 监控项保持的历史数据时长,默认90天,单位天

formula 公式,自定义乘数

1 默认值

lastclock 监控项最后一次更新时间

logtimefmt 格式化日志时间

templateid 监控项对应的父模版ID,该ID自关联,模版对应的为hostid相当于模版分组

flags 监控项来源

0 普通

4 自动发现

interfaceid 网卡IP,对应interface表interfaceid

params 额外的参数类型取决于监控项

针对ssh和telnet监控项 执行脚本

数据库监控项 执行sql

计算类型 执行公式

port 针对snmp监控项,端口监控

password 密码认证,针对简单检查,ssh,telnet,数据库监视,jmx监控项

description 监控项描述信息

state 该监控项是否适用

0 支持

1不支持

 

用 curl 模拟 API 的使用


# 1. 获取 SESSIONID

[root@linux-node1 ~]# curl -s -X POST -H 'Content-Type:application/json' -d ' > { > "jsonrpc": "2.0", > "method": "user.login", > "params": { > "user": "Admin", > "password": "zabbix" > }, > "id": 1 > }' http://192.168.56.11/zabbix/api_jsonrpc.php | python -m json.tool { "id": 1, "jsonrpc": "2.0", "result": "6a0d235908c25a495f0d356157fbb3d3" } # 2. 用获取的 SESSIONID 去调用 API 的 host.get 方法请求 hostid [root@linux-node1 ~]# curl -s -X POST -H 'Content-Type:application/json' -d ' > { > "jsonrpc": "2.0", > "method": "host.get", > "params": { > "output": ["hostid"] > }, > "auth": "6a0d235908c25a495f0d356157fbb3d3", > "id": 1 > }' http://192.168.56.11/zabbix/api_jsonrpc.php | python -m json.tool { "id": 1, "jsonrpc": "2.0", "result": [ { "hostid": "10084" }, { "hostid": "10120" } ] } 

可以通过 API 来添加和删除 Host,这里就不举例了,具体方法参考官网文档。
在实际的 API 开发应用中,我们可以采用 Python 等其他编程语言中来实现。 如下,就是用 Python 写的用于认证获取 SESSIONID 的代码例子:


#!/usr/bin/env python
# -*- coding:utf-8 -*-

import requests
import json url = 'http://192.168.56.11/zabbix/api_jsonrpc.php' post_data = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "zabbix" }, "id": 1 } post_header = {'Content-Type': 'application/json'} ret = requests.post(url, data=json.dumps(post_data), headers=post_header) zabbix_ret = json.loads(ret.text) if not zabbix_ret.has_key('result'): print 'login error' else: print zabbix_ret.get('result') 

执行脚本时,注意要安装 Python requests 模块。


[root@linux-node1 ~]# python zabbix_auth.py
Traceback (most recent call last):
  File "zabbix_auth.py", line 4, in <module> import requests ImportError: No module named requests [root@linux-node1 ~]# yum install python-pip -y [root@linux-node1 ~]# pip install requests [root@linux-node1 ~]# python zabbix_auth.py f2453c4cc730d5158a87e0754940138e 

 

  

调用Zabbix api使用的是HTTP的POST请求方式

其中请求的头部为:

{"Content-Type": "application/json-rpc"}
 

请求的URL为:

http://zabbix.aek.com/api_jsonrpc.php
 

如果url中包含目录需要把目录写上,如http://zabbix.aek.com/zabbix/api_jsonrpc.php,最后就是请求的数据(data),比如获取Token,创建主机,获取主机ID,获取模板ID,获取组ID,删除主机等。

 

接下以以Python调用 API为例,例出用法案例:

测试连接是否成功

#!/usr/bin/python
#coding:utf:8

import requests
import json url = "http://zabbix.aek.com/zabbix/api_jsonrpc.php" header = {"Content-Type": "application/json-rpc"} data = {"jsonrpc":"2.0","method":"apiinfo.version","id":1,"auth":None,"params":{}} request = requests.post(url=url, headers=header, data=json.dumps(data)) print(request.content)
 

上面的data用来测试是否可连接成功,官方文档中auth的值为null,但在python中null用None表示,所以需要改成None。

成功后返回值大概如下:会显示zabbix版本

{"jsonrpc":"2.0","result":"3.2.3","id":1}
 

获取Token

#!/usr/bin/python
#coding:utf:8

import requests
import json url = "http://zabbix.aek.com/zabbix/api_jsonrpc.php" header = {"Content-Type": "application/json-rpc"} data = {"jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "zabbix" }, "id": 1, "auth": None } request = requests.post(url=url, headers=header, data=json.dumps(data)) print(request.content)
 

成功后返回值如下:会返回一个Token

{"jsonrpc":"2.0","result":"391277f070a3ebc5b2afe9cf466cb74c","id":1}
 

最后以一个完整的Python脚本通过zabbix API获取所有主机的信息为例:

#!/usr/bin/python
#coding:utf:8

import requests
import json class Zabbix: def __init__(self, url, header, username, password): self.url = url self.header = header self.username = username self.password = password def getToken(self): #获取Token并返回字符Token字符串 data = {"jsonrpc": "2.0", "method": "user.login", "params": { "user": self.username, "password": self.password }, "id": 1, "auth": None } token = requests.post(url=self.url, headers=self.header, data=json.dumps(data)) return json.loads(token.content)["result"] def getAllHost(self): #获取所有主机信息 data = {"jsonrpc": "2.0", "method": "host.get", "params": { "output": [ "hostid", "host", ], "selectGroups": "extend", "selectInterfaces": [ "interfaceid", "ip" ] }, "id": 2, "auth": self.getToken() } hosts = requests.post(url=self.url, headers=self.header, data=json.dumps(data)) return json.loads(hosts.content)["result"] if __name__ == "__main__": header = {"Content-Type": "application/json-rpc"} url="http://zabbix.aek.com/zabbix/api_jsonrpc.php" test = Zabbix(url=url, header=header, username="Admin", password="zabbix") print(test.getAllHost())
 

通过以上的学习相信大家对Zabbix API已经有一个初步的认识,后面将会通过API去完成主机的自动添加,自动化报表等使用

 

 

 

python3(requests)调用zabbix-4.2.3-api添加修改主机

自动化是需求,手动太慢,自动发现没玩过。用的比较多的就是调API来操作。

zabbix版本为4.2.3 python3 需要reuquests,json模块

下面是代码,只写了添加和删除的功能,有需求的可以自己加一下

'''
2019.6.19
zabbix API 修改主机
'''

import json,requests

headers={"Content-Type":"application/json"}
url 'http://www.zabbix.com/zabbix/api_jsonrpc.php'

def getAuth(user,password):
    try:
        global headers, url
        data = json.dumps({
        "jsonrpc": "2.0",
        "method": "user.login",
        "params": {
            "user": user,
            "password": password
        },
        "id": 1,
        })
        res = requests.post(url,data=data,headers=headers)
        auth = res.json().get('result','')
        return  auth
    except Exception as err:
        pass

def getHost(auth):
    try:
        global headers,url
        data = json.dumps({
                "jsonrpc": "2.0",
                "method": "host.get",
                "params": {
                    "output": [
                        "hostid",
                        "host"],
                    "selectInterfaces": [
                        "interfaceid",
                        "ip"]},
                "id": 2,
                "auth": auth
            })
        res = requests.post(url,data=data,headers=headers)
        host = res.json()
        return  host
    except:
        pass


def getGroupid(auth,groupname):
    try:
        global headers, url
        data = json.dumps({
                "jsonrpc": "2.0",
                "method": "hostgroup.get",
                "params": {
                    "output": "extend",
                    "filter": {
                        "name": [groupname]}},
                "auth": auth,
                "id": 1
        })
        res = requests.post(url,data=data,headers=headers)
        groupid = res.json()['result'][0]['groupid']
        return groupid
    except:
        pass

def getTempid(auth,tempname):
    try:
        global headers, url
        # print(templist)
        data = json.dumps(
            {
                "jsonrpc": "2.0",
                "method": "template.get",
                "params": {
                    "output": "extend",
                    "filter": {
                        "host": tempname}},
                "auth": auth,
                "id": 1}
        )
        res = requests.post(url,data=data,headers=headers)
        tempid []
        for i in range(len(res.json()['result'])):
            id = res.json(

转载于:https://www.cnblogs.com/xuefy/p/11413703.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值