基于Python调用zabbix监控的API接口详解,将数据展现到前台过程、思路分析

在这里插入图片描述
这是zabbix的官网,文档内容非常丰富,建议有需要的,可以多花点时间看一下官方的文档。
下面这是部署在我的虚拟机下的zabbix监控
在这里插入图片描述
在这里插入图片描述
上图中报红色的zabbix是因为那两个虚拟机我没有打开,只打开了zabbix-master在这里插入图片描述
我们可以看到我使用了linux server这个模板,有51个监控项,以及触发器和图形。
在这里插入图片描述

我做的运维平台的监控原理大致是这样一个过程:
  1. 首先,zabbix部署了一个名为Linux Server的主机组,该主机组下面部署了3台linux主机,每台linux主机下面各设置了大约50各监控项。
  2. 我在后端调用zabbix的API接口,由主机组---------> 主机---------> 监控项---------> 获取数据,最后将获取的数据返回到前台。
  3. 后端获取的数据,在后端使用dataHandle(),去搜集数据(这里是json格式的),并且存为一个字典,然后在去遍历,并返回给前台。

举个例子:获取网络流量流出数据
1,首先定义一个接口方法:


def getNetOutDataTraffic(*args, **b):
    '''
    网络流出数据
    '''
    NetOutDataTraffic_data = json.dumps({
        "jsonrpc": "2.0",
        "method": "history.get",
        "params": {
            "output": "extend",
            # "itemids": b["parameter"],
            "itemids": 28461,  #  net.if.out[eno16777736] 网卡out数据
            "history": 3,  #这里有5个可选参数分别是0,1,2,3,4,默认是3,下面会介绍每个参数的意义
            "limit": 16
        },
        "auth": b["session"],
        "id": 2
    })
    return NetOutDataTraffic_data

########################################################################

或者也可以单独去获取某个监控主机组下的单个主机的某个单独的监控项:

比如说:

def getfsused(*args, **b):
    '''
    获取磁盘使用量
    '''
    disk_data = json.dumps({
        "jsonrpc": "2.0",
        "method": "item.get",
        "params": {
            "output": "extend",
            "hostids": b["parameter"],
            "search": {
                "key_": "vfs.fs.size[/,used]"  # 只查询key_包含“vfs.fs.size[/,used]”字段的item
                # "key_": "vfs.fs.size[/,free]"
            }
        },
        "auth": b["session"],
        "id": 2
    })
    return disk_data


上面定义的方法,可以看出是获取eno16777736网卡,这个流出16条历史数据,也可以价格desc参数,进行排序,也可以基于一个时间段进行排序,也可以根据sortfield某个字段进行排序,等等。下面会进行详细解释。这是官网API文档。非常详细。

2,使用dataHandle(),去搜集通过API获取的数据,并且进行遍历,

  '''获取网络流量流出数据'''
        netOutDataTraffic_dict = dataHandle(func=getNetOutDataTraffic, hostid=hostid)

进行遍历获取到的16条历史数据:
 netOutdatalist = [] #首先定义一个空列表进行存value这个多条数据
        for i in netOutDataTraffic_dict:    # 然后进行遍历
            netOutdatalist.append(i['value'])
            netOutDataTraffic_now = netOutdatalist
            # netInDataTraffic_now  # 网络流量流入历史数据 net.if.in[eno16777736]

3,将遍历的结果返回给前台,用 **render()**进行渲染。

 "netOutDatatraffic_now": netOutDataTraffic_now,  # 网络流量流出数据
 

前台只需要使用Django的tag,就可以捕获到后台传来的数据。
整个核心代码:

@login_required
def getMonitor(request):
    """
    获取zabbix监控的主机列表

    """
    monitorform = monitorForm()
    zabbix_host_info = dataHandle(func=getZabbixHost)
    monitor_hostnames = []
    cpuutils_now = ''
    cpuload_now = ''
    fsused_now = ''
    fsfree_now = ''
    fshomefree_now = ''
    fshomeused_now = ''
    fsbootfree_now = ''
    fsbootused_now = ''
    fsmemsize_now = ''
    fsCpuUserHistory_now = ''
    fsCpuUserHistory_now_x = ''
    fsCpuSysHistory_now = ''
    netInDataTraffic_now = ''
    netInDataTraffic_now_x = ''
    netOutDataTraffic_now = ''
    for i in zabbix_host_info:
        monitor_hostid = i['hostid']
        monitor_hostname = i['host']
        monitor_hostnames = monitor_hostnames + [(monitor_hostid, monitor_hostname)]
    host_num = len(monitor_hostnames)
    monitorform.fields['monitorHost'].choices = monitor_hostnames

    '''获取提交的主机ID'''
    try:
        if request.method == "POST":
            if "monitorHost" in request.POST:  # name为monitorHost的表单提交
                hostid = request.POST.get('monitorHost', '')
            else:
                hostid = 10084
        else:
            hostid = 10084

        '''获取提交主机的itemids'''
        itemids = dataHandle(func=getZabbixitem,hostid=hostid)

        '''获取CPU使用率'''
        cpuutils_dict = dataHandle(func=getZabbixCPUutil, hostid=hostid)

        '''获取CPU负载'''
        cpuload_dict = dataHandle(func=getZabbixCPUload, hostid=hostid)

        '''获取硬盘使用量'''
        fsused_dict = dataHandle(func=getfsused, hostid=hostid)

        '''获取硬盘空闲'''
        fsfree_dict = dataHandle(func=getfsfree, hostid=hostid)

        '''获取home目录free空间'''
        fshomefree_dict = dataHandle(func=getfshomefree, hostid=hostid)

        '''获取home目录used空间'''
        fshomeused_dict = dataHandle(func=getfshomeused, hostid=hostid)

        '''获取boot目录free空间'''
        fsbootfree_dict = dataHandle(func=getfsbootfree, hostid=hostid)

        '''获取boot目录used空间'''
        fsbootused_dict = dataHandle(func=getfsbootused, hostid=hostid)

        '''获取memory的大小'''
        fsmemsize_dict = dataHandle(func=getmemsize, hostid=hostid)

        '''获取用户空间使用CPU比例历史数据'''
        fsCpuUserHistory_dict = dataHandle(func=getCpuUserHistory, hostid=hostid)

        '''获取内核空间使用CPU比例的历史数据'''
        fsCpuSysHistory_dict = dataHandle(func=getCpuSysHistory, hostid=hostid)

        '''获取网络流量流ru数据'''
        netInDataTraffic_dict = dataHandle(func=getNetInDataTraffic, hostid=hostid)

        '''获取网络流量流出数据'''
        netOutDataTraffic_dict = dataHandle(func=getNetOutDataTraffic, hostid=hostid)

        for i in cpuutils_dict:
            cpuutils_now = i['prevvalue']  # CPU当前使用率百分比
        for i in cpuload_dict:
            cpuload_now = i['prevvalue']  # CPU当前负载百分比
        for i in fsused_dict:
            fsused_now = i['prevvalue']  # 根磁盘使用量
        for i in fsfree_dict:
            fsfree_now = i['prevvalue']  # 根磁盘空闲
        for i in fshomefree_dict:
            fshomefree_now = i['prevvalue']  # home分区空闲
        for i in fshomeused_dict:
            fshomeused_now = i['prevvalue']  # home分区使用量
        for i in fsbootfree_dict:
            fsbootfree_now = i['prevvalue']  # boot分区空闲量
        for i in fsbootused_dict:
            fsbootused_now = i['prevvalue']  # boot分区使用量
        for i in fsmemsize_dict:
            fsmemsize_now = i['prevvalue']  # memory大小

        cpuuserdatalist = []
        for i in fsCpuUserHistory_dict:
            cpuuserdatalist.append(i['value'])
            fsCpuUserHistory_now = cpuuserdatalist
            # fsCpuHistory_now  # 历史数据大小 system.cpu.util[,user]

        cpuuserdatelist=[]
        for i in fsCpuUserHistory_dict:
            cpuuserdatelist.append(i['clock'])
            fsCpuUserHistory_now_x = cpuuserdatelist  # 历史数据时间轴 system.cpu.util[,user]


        cpusysdatalist = []
        for i in fsCpuSysHistory_dict:
            cpusysdatalist.append(i['value'])
            fsCpuSysHistory_now = cpusysdatalist
            # fsCpuSysHistory_now  # 内核空间使用CPU比例历史数据大小 system.cpu.util[,system]

        netIndatalist = []
        for i in netInDataTraffic_dict:
            netIndatalist.append(i['value'])
            netInDataTraffic_now = netIndatalist
            # netInDataTraffic_now  # 网络流量流入历史数据 net.if.in[eno16777736]

        netIndatelist = []
        for i in netInDataTraffic_dict:
            netIndatelist.append(i['clock'])
            netInDataTraffic_now_x = netIndatelist
            # netInDataTraffic_now  # 获取网络流量流入历史数据的时间戳 net.if.in[eno16777736]

        netOutdatalist = []
        for i in netOutDataTraffic_dict:
            netOutdatalist.append(i['value'])
            netOutDataTraffic_now = netOutdatalist
            # netInDataTraffic_now  # 网络流量流入历史数据 net.if.in[eno16777736]
    except KeyError as e:
        print(e)
        pass

    '''获取内存使用率最后..次的数据'''
    me_data = monitorMemory.objects.filter(hostid=hostid)
    '''返回的前端的字典'''
    monitor_dict = {
        "monitorform": monitorform,  # 监控主机的表单
        "monitor_hostnames": monitor_hostnames,  # 监控的主机的下拉菜单列表
        "host_num": host_num,  # 监控的主机个数
        "cpuutils_now": cpuutils_now,  # CPU当前使用率
        "cpuload_now": cpuload_now,  # CPU当前负载
        "fsused_now": fsused_now,  # 磁盘使用量
        "fsfree_now": fsfree_now,  # 磁盘空闲
        "fshomefree_now": fshomefree_now,  # home 空闲
        "fshomeused_now": fshomeused_now,  # home partation used
        "fsbootfree_now": fsbootfree_now,  # boot 分区free
        "fsbootused_now": fsbootused_now,  # boot 分区used
        "fsmemsize_now": fsmemsize_now,  # memory 大小
        "fsCpuUserHistory_now": fsCpuUserHistory_now,  # CPU用户空间 历史数据大小
        "fsCpuUserHistory_now_x": fsCpuUserHistory_now_x,  # CPU用户空间历史数据大小
        "fsCpuSysHistory_now": fsCpuSysHistory_now,  # CPU内核空间历史数据大小
        "netInDatatraffic_now": netInDataTraffic_now,  # 网络流量流入数据
        "netInDatatraffic_now_x": netInDataTraffic_now_x,  # 网络流量流入数据时间戳
        "netOutDatatraffic_now": netOutDataTraffic_now,  # 网络流量流出数据
        "data": me_data,
    }
    return render(request, 'Monitor.html', monitor_dict)

上面是大致的思路,比较简单。但是要想熟悉整个操作,那么zabbix的api必须要会使用,每个监控项的参数也会用。
######################################################################
这里先说一下web ui下添加监控项的参数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

大致就能明白后台读的监控项是怎么来的了,是我们自己创建的,或者说是使用的监控模板里面的,从最后一张图可以看出来,基本上每一个监控项后面都有参数,我们不难发现<> 包围起来的参数,是可选参数,而[],这个参数是必选。而且监控项是key:value 这种格式的。
下面开始一一介绍:

首先贴上官方文档:
在这里插入图片描述
https://www.zabbix.com/documentation/3.4/manual/api/reference/history/get

二、Zabbix API可以通过JSON RPC协议来获取历史数据。可以采用脚本或者任何支持JSON RPC的工具来使用API。
 基本请求格式
  Zabbix API 简化的JSON请求如下:
  {
  "jsonrpc": "2.0",
  "method": "method.name",
  "params": {
  "param_1_name": "param_1_value",
  "param_2_name": "param_2_value"
  },
  "id": 1,
  "auth": "a826fca79a0795ccc1224dc76329972f",
  }

下面一行一行来看:
  ● “jsonrpc”: “2.0”-这是标准的JSON RPC参数以标示协议版本。所有的请求都会保持不变。
  ● “method”: “method.name”-这个参数定义了真实执行的操作。例如:host.create、item.update,history.get等等
  ● “params”-这里通过传递JSON对象来作为特定方法的参数。如果你希望创建监控项,"name"和"key_“参数是需要的,每个方法需要的参数在Zabbix API文档中都有描述。
  ● “id”: 1-这个字段用于绑定JSON请求和响应。响应会跟请求有相同的"id”。在一次性发送多个请求时很有用,这些也不需要唯一或者连续
  ● “auth”: “a826fca79a0795ccc1224dc76329972f”-这是一个认证令牌【authentication token】用以鉴别用户、访问API。这也是使用API进行相关操作的前提-获取认证ID。

举个例子:

获取192.168.211.60从2014.2.19 14:00:00到2014.2.19 14:10:00的cpu_idle值.

基于curl命令:
  (1):认证并且取得加密字段
  curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":
  "2.0","method":"user.login","params":{"user":"xxxx","password":"xxxx"},"auth":
  null,"id":0}' http://x.x.x.x/api_jsonrpc.php
  #之后会得到一串输出:{"jsonrpc":"2.0","result":"a826fca79a0795ccc1224dc76329972f","id":0}。记住这
  段输出。
  (2)获取监控主机的hostids
  curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc": "2.0","method":"host.get","params":{"output":["hostid"],"filter": {"host":"192.168.211.60"}},"auth": "a826fca79a0795ccc1224dc76329972f","id": 0}' http://x.x.x.x/api_jsonrpc.php
  #"hostid":"10243"
  (3)获得监控项itemids
  curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc": "2.0","method":"item.get","params":{"output":"itemids","hostids":"10243","search":{"key_":"system.cpu.util
  [,idle,avg1]"}},"auth": "a826fca79a0795ccc1224dc76329972f","id": 0}' http://x.x.x.x/api_jsonrpc.php
  #“item”:"24526"
  (4)获取监控项"system.cpu.util[,idle,avg1]"2014.2.19 14:00~14:20的值
  curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc": "2.0","method":"history.get","params":{"history":0,"itemids":["24526"],"time_from":"1392789600","time_till":"1392790200","output":"extend"},"auth": "a826fca79a0795ccc1224dc76329972f","id": 0}' http://x.x.x.x/api_jsonrpc.php

输出:

#输出:
  [{"itemid":"24526","clock":"1392789646","value":"95.7539","ns":"138978589"},
  {"itemid":"24526","clock":"1392789706","value":"84.9595","ns":"578198422"},
  {"itemid":"24526","clock":"1392789766","value":"94.5259","ns":"186216653"},
  {"itemid":"24526","clock":"1392789826","value":"96.2286","ns":"789434167"},
  {"itemid":"24526","clock":"1392789886","value":"94.7712","ns":"191954191"},
  {"itemid":"24526","clock":"1392789946","value":"90.8338","ns":"781241168"},
  {"itemid":"24526","clock":"1392790006","value":"89.1735","ns":"294674458"},
  {"itemid":"24526","clock":"1392790066","value":"92.3015","ns":"877714419"},
  {"itemid":"24526","clock":"1392790126","value":"96.3051","ns":"426421789"},
  {"itemid":"24526","clock":"1392790186","value":"97.7931","ns":"174500891"}]
  #“value”就是cpu idle值,采样间隔时间与监控项的数据更新时间一致。


补充:获取192.168.211.60监控项"system.cpu.util[,idle,avg1]"20190911日 下午2:02:46 的值
  curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc": "2.0","method":"history.get","params":{"history":0,"itemids":["24526"],"time_from":"1392789600","time_till":"1392790200","output":"extend","filter":{"clock":"1572789766"}},"auth": "a826fca79a0795ccc1224dc76329972f","id": 0}' http://x.x.x.x/api_jsonrpc.php
  #"value":"94.5259"要获取的值
三、根据zabbix的参数选项是否为必须,进行解释

address:是我的项目测试地址:192.168.36.133,这里由于是本机直接使用127.0.0.1
一定要注意后面获取历史数据时,参数得到问题,要把history改为0,不然会出现获取不到数据。
一定要注意,因为这个问题,我一直没发现是这个原因,后来仔细看了官方文档才发现问题出在这里。

1,user.login方法获得认证密钥。

1)请求的方法参数

参数名称值类型说明是否必须
jsonrpcstr接口版本
methodstr请求方法
paramsjson请求方法参数
userstrzabbix账号
passwordstrzabbix密码
authstr认证的key
idint认证id

2) 请求的示例

[root@zabbix-master cmdd]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc":"2.0","method":"user.login","params":{"user":"Admin","password":"zabbix"},"auth":null,"id":0}' http://127.0.0.1/zabbix/api_jsonrpc.php
HTTP/1.1 200 OK
Date: Fri, 13 Sep 2019 11:32:10 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
X-Powered-By: PHP/5.4.16
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 1000
Content-Length: 68
Content-Type: application/json

返回得到response数据格式
{"jsonrpc":"2.0","result":"e66e63d8916eebceeae3cddf721f4e93","id":0}[root@zabbix-master cmdd]# 
2, hostgroup.get方法获取所有主机组ID
参数名称值类型说明是否必须
jsonrpcstr接口版本
methodstr请求方法
paramsjson请求方法参数
outputarray输出格式
groupidstr主机组id
namestr主机组名
authstr认证的key
idint认证id
  1. 请求的示例
root@zabbix-master cmdd]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc": "2.0","method":"hostgroup.get","params":{"output":["groupid","name"]},"auth":"e66e63d8916eebceeae3cddf721f4e93","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php                                
HTTP/1.1 200 OK
Date: Fri, 13 Sep 2019 11:37:57 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
X-Powered-By: PHP/5.4.16
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 1000
Content-Length: 666
Content-Type: application/json







输出的结果response数据格式
{"jsonrpc":"2.0","result":[{"groupid":"5","name":"Discovered hosts"},{"groupid":"7","name":"Hypervisors"},{"groupid":"2","name":"Linux servers"},{"groupid":"1","name":"Templates"},{"groupid":"12","name":"Templates/Applications"},{"groupid":"13","name":"Templates/Databases"},{"groupid":"8","name":"Templates/Modules"},{"groupid":"9","name":"Templates/Network Devices"},{"groupid":"10","name":"Templates/Operating Systems"},{"groupid":"11","name":"Templates/Servers Hardware"},{"groupid":"14","name":"Templates/Virtualization"},{"groupid":"6","name":"Virtual machines"},{"groupid":"15","name":"Web \u76d1\u63a7\u7ec4"},{"groupid":"4","name":"Zabbix servers"}],"id":0}[root@zabbix-master cmdd]# 
[root@zabbix-master cmdd]# 
[root@zabbix-master cmdd]# 
3,host.get方法获取单个主机组下所有的主机ID

1)请求的方法参数

参数名称值类型说明是否必须
jsonrpcstr接口版本
methodstr请求方法
paramsjson请求方法参数
outputarray输出格式
groupidstr主机组id
authstr认证的key
idint认证id

2)请求的示例

[root@zabbix-master cmdd]# curl -i -X POST -H'Content-Type: application/json' -d '{"jsonrpc":"2.0","method":"host.get","params":{"output":["hostid","name"],"groupids":"2"},"auth":"e66e63d8916eebceeae3cddf721f4e93","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php                           
HTTP/1.1 200 OK
Date: Fri, 13 Sep 2019 11:40:03 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
X-Powered-By: PHP/5.4.16
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 1000
Content-Length: 163
Content-Type: application/json


输出的结果response数据格式
{"jsonrpc":"2.0","result":[{"hostid":"10256","name":"zabbix server"},{"hostid":"10257","name":"zabbix slaver1"},{"hostid":"10262","name":"zabbix slaver2"}],"id":0}[root@zabbix-master cmdd]# 
4,itemsid.get方法获取单个主机下所有的监控项ID

1)请求的方法参数

参数名称值类型说明是否必须
jsonrpcstr接口版本
methodstr请求方法
paramsjson请求方法参数
outputarray输出格式
groupidstr主机组id
authstr认证的key
idint认证id
  1. 请求的示例
[root@zabbix-master cmdd]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc":"2.0","method":"item.get","params":{"output":["itemids","key_"],"hostids":"10256"},"auth":"e66e63d8916eebceeae3cddf721f4e93","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php       
HTTP/1.1 200 OK
Date: Fri, 13 Sep 2019 11:43:03 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
X-Powered-By: PHP/5.4.16
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 1000
Content-Length: 2566
Content-Type: application/json


输出的数据结果response数据格式

{"jsonrpc":"2.0","result":[
{"itemid":"28344","key_":"agent.hostname"},
{"itemid":"28345","key_":"agent.ping"},
{"itemid":"28346","key_":"agent.version"},
{"itemid":"28347","key_":"kernel.maxfiles"},
{"itemid":"28348","key_":"kernel.maxproc"},
{"itemid":"28460","key_":"net.if.in[eno16777736]"},
{"itemid":"28461","key_":"net.if.out[eno16777736]"},
{"itemid":"28334","key_":"net.tcp.service[ssh]"},
{"itemid":"28349","key_":"proc.num[,,run]"},
{"itemid":"28350","key_":"proc.num[]"},
{"itemid":"28351","key_":"system.boottime"},
{"itemid":"28352","key_":"system.cpu.intr"},{"itemid":"28353","key_":"system.cpu.load[percpu,avg15]"},
{"itemid":"28354","key_":"system.cpu.load[percpu,avg1]"},{"itemid":"28355","key_":"system.cpu.load[percpu,avg5]"},{"itemid":"28356","key_":"system.cpu.switches"},
{"itemid":"28357","key_":"system.cpu.util[,idle]"},{"itemid":"28358","key_":"system.cpu.util[,interrupt]"},{"itemid":"28359","key_":"system.cpu.util[,iowait]"},
{"itemid":"28360","key_":"system.cpu.util[,nice]"},
{"itemid":"28361","key_":"system.cpu.util[,softirq]"},{"itemid":"28362","key_":"system.cpu.util[,steal]"},
{"itemid":"28363","key_":"system.cpu.util[,system]"},
{"itemid":"28364","key_":"system.cpu.util[,user]"},{"itemid":"28365","key_":"system.hostname"},
{"itemid":"28366","key_":"system.localtime"},{"itemid":"28367","key_":"system.swap.size[,free]"},{"itemid":"28368","key_":"system.swap.size[,pfree]"},
{"itemid":"28369","key_":"system.swap.size[,total]"},{"itemid":"28370","key_":"system.uname"},
{"itemid":"28371","key_":"system.uptime"},{"itemid":"28372","key_":"system.users.num"},{"itemid":"28373","key_":"vfs.file.cksum[/etc/passwd]"},
{"itemid":"28462","key_":"vfs.fs.inode[/,pfree]"},{"itemid":"28463","key_":"vfs.fs.inode[/boot,pfree]"},
{"itemid":"28464","key_":"vfs.fs.inode[/home,pfree]"},{"itemid":"28465","key_":"vfs.fs.size[/,free]"},{"itemid":"28468","key_":"vfs.fs.size[/,pfree]"},
{"itemid":"28471","key_":"vfs.fs.size[/,total]"},{"itemid":"28474","key_":"vfs.fs.size[/,used]"},
{"itemid":"28466","key_":"vfs.fs.size[/boot,free]"},{"itemid":"28469","key_":"vfs.fs.size[/boot,pfree]"},{"itemid":"28472","key_":"vfs.fs.size[/boot,total]"},
{"itemid":"28475","key_":"vfs.fs.size[/boot,used]"},
{"itemid":"28467","key_":"vfs.fs.size[/home,free]"},{"itemid":"28470","key_":"vfs.fs.size[/home,pfree]"},
{"itemid":"28473","key_":"vfs.fs.size[/home,total]"},{"itemid":"28476","key_":"vfs.fs.size[/home,used]"},
{"itemid":"28374","key_":"vm.memory.size[available]"},{"itemid":"28517","key_":"vm.memory.size[free]"},
{"itemid":"28375","key_":"vm.memory.size[total]"}],"id":0}
[root@zabbix-master cmdd]# 
[root@zabbix-master cmdd]# 
5,history.get方法获取单个监控项的历史数据
  1. 请求的方法参数
参数名称值类型说明是否必须
jsonrpcstr接口版本
methodstr请求方法
paramsjson请求方法参数
outputarray输出格式
historyint所返回的历史对象类型. 0 - numeric float; 1 - character; 2 - log; 3 - numeric unsigned; 4 - text. Default: 3.
hostidsstr/array主机组id
time_fromtimestamp仅返回在给定时间之后或之后收到的值
itemidstimestamp仅返回在给定时间之前或之前收到的值
sortfieldstr/array按照给定的属性对结果进行排序(可以是itemid或者clock)
sortorderstr/arrayASC- 升序; DESC - 降序
limitint限制返回采集最近几次数据(通常带上)
countOutputflag返回结果中的记录数,而不是实际的数据
authstr认证的key
idint认证id

2) 请求的示例

[root@zabbix-master cmdd]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc":"2.0","method":"history.get","params":{"history":0,"itemids":"28362","output":"extend","limit":10},"auth":"e66e63d8916eebceeae3cddf721f4e93","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php 
HTTP/1.1 200 OK
Date: Fri, 13 Sep 2019 11:55:51 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
X-Powered-By: PHP/5.4.16
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 1000
Content-Length: 774
Content-Type: application/json




输出结果:response数据格式
{"jsonrpc":"2.0","result":[{"itemid":"28362","clock":"1567768062","value":"0.0000","ns":"221267790"},
{"itemid":"28362","clock":"1567768122","value":"0.0000","ns":"280608396"},
{"itemid":"28362","clock":"1567768182","value":"0.0000","ns":"334630728"},
{"itemid":"28362","clock":"1567768242","value":"0.0000","ns":"52002418"},
{"itemid":"28362","clock":"1567768302","value":"0.0000","ns":"121115996"},
{"itemid":"28362","clock":"1567768362","value":"0.0000","ns":"189875910"},
{"itemid":"28362","clock":"1567768422","value":"0.0000","ns":"334948438"},
{"itemid":"28362","clock":"1567768482","value":"0.0000","ns":"427439259"},
{"itemid":"28362","clock":"1567768542","value":"0.0000","ns":"627033918"},
{"itemid":"28362","clock":"1567768602","value":"0.0000","ns":"693077056"}
],"id":0}
[root@zabbix-master cmdd]# 
[root@zabbix-master cmdd]# 
[root@zabbix-master cmdd]# 


--------------------:要获取最新数据limit为1即可----------------
6,get方法的通用参数
参数名称值类型说明
countOutputflag返回结果中的记录数,而不是实际的数据
editableboolean如果设置为true仅返回用户具有写入权限的对象,默认为false
excludeSearchflag返回与search参数中给出的标准不匹配的结果
filterobject仅返回与给定过滤器完全匹配的结果,接受一个数组,其中的键是属性名称,并且值是单个值或要匹配的值的数组
limitint限制返回的记录数
outputquery要返回的对象属性,默认值:extend
preservekeysflag在结果数组中使用ID作为键
searchobject返回匹配给定通配符搜索的结果,接受一个数组,其中键是属性名,值是要搜索的字符串.如果没有额外的选项,这将执行LIKE “%…%”搜索,仅适用于string和text领域
searchByAnyboolean如果设置为true返回与filteror或search参数中给出的任何条件匹配的结果,而不是所有这些结果,默认false
searchWildcardsEnabledboolean如果设置为true使能“*”作为search参数中的通配符,默认值为false
sortfieldstr/array按照给定的属性对结果进行排序(可以是itemid或者clock)
sortorderstr/arrayASC- 升序; DESC - 降序
startSearchflag该search参数将比较领域的开始,也就是进行LIKE “…%”搜索来代替

四、下面开始基于python来实现API接口调用,并且使用curl来获取结果对比。

1. user.login方法获取zabbix server的认证结果

官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/user/login

# vim auth.py内容如下:

#!/usr/bin/env python2.7

#coding=utf-8

import json

import urllib2

from urllib2 import URLError

# based url and required header

url = "http://127.0.0.1/zabbix/api_jsonrpc.php"

header = {"Content-Type":"application/json"}

# auth user and password

data = json.dumps(

{

   "jsonrpc": "2.0",

   "method": "user.login",

   "params": {

   "user": "Admin",

   "password": "zabbix"

},

"id": 0

})

# create request object

request = urllib2.Request(url,data)

for key in header:

   request.add_header(key,header[key])

# auth and get authid

try:

   result = urllib2.urlopen(request)

except URLError as e:

   print "Auth Failed, Please Check Your Name AndPassword:",e.code

else:

   response = json.loads(result.read())

   result.close()

print"Auth Successful. The Auth ID Is:",response['result']

 

python脚本运行结果:

[root@Xururu ~]# python auth.py

Auth Successful. The Auth ID Is: 0c29d9efcee2ce856c41431d0dcd60d9
curl命令:

[root@Xururu ~]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc":

"2.0","method":"user.login","params":{"user":"Admin","password":"zabbix"},"auth":

null,"id":0}' http://127.0.0.1/zabbix/api_jsonrpc.php


curl命令运行结果:

{"jsonrpc":"2.0","result":"9f08062e9315803e94dbd6a5f1828a45","id":0}

在这里插入图片描述

2. hostgroup.get方法获取所有主机组ID

把认证密钥放到脚本中,每次获取数据时都需要认证。此处是获取zabbix server上的所有主机组名称与ID号。

官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/hostgroup/get

python脚本:

[root@Xururu ~]# vim get_hostgroup_list.py

内容如下:

#!/usr/bin/env python2.7

#coding=utf-8

import json

import urllib2

from urllib2 import URLError

# based url and required header

url = "http://127.0.0.1/zabbix/api_jsonrpc.php"

header = {"Content-Type":"application/json"}

# request json

data = json.dumps(

{

   "jsonrpc":"2.0",

   "method":"hostgroup.get",

   "params":{

       "output":["groupid","name"],

   },

   "auth":"0c29d9efcee2ce856c41431d0dcd60d9", # theauth id is what auth script returns, remeber it is string

   "id":1,

})

# create request object

request = urllib2.Request(url,data)

for key in header:

   request.add_header(key,header[key])

# get host list

try:

   result = urllib2.urlopen(request)

except URLError as e:

   if hasattr(e, 'reason'):

       print 'We failed to reach a server.'

       print 'Reason: ', e.reason

   elif hasattr(e, 'code'):

       print 'The server could not fulfill the request.'

       print 'Error code: ', e.code

else:

   response = json.loads(result.read())

   result.close()

   print "Number Of Hosts: ", len(response['result'])

   #print response

   for group in response['result']:

       print "Group ID:",group['groupid'],"\tGroupName:",group['name']




 

python脚本执行结果:

[root@Xururu ~]# python get_hostgroup_list.py

Number Of Hosts:  6

Group ID: 5 GroupName: Discovered hosts

Group ID: 7 GroupName: Hypervisors

Group ID: 2 GroupName: Linux servers

Group ID: 1 GroupName: Templates

Group ID: 6 GroupName: Virtual machines

Group ID: 4 GroupName: Zabbix servers
curl命令:
[root@Xururu ~]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc": "2.0","method":"hostgroup.get","params":{"output":["groupid","name"]},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php

curl命令运行结果:

[root@Xururu ~]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc": "2.0","method":"hostgroup.get","params":{"output":["groupid","name"]},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php

HTTP/1.1 200 OK

Date: Sun, 13 Aug 2017 01:54:39 GMT

Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16

X-Powered-By: PHP/5.4.16

Access-Control-Allow-Origin: *

Access-Control-Allow-Headers: Content-Type

Access-Control-Allow-Methods: POST

Access-Control-Max-Age: 1000

Content-Length: 270

Content-Type: application/json

 

{"jsonrpc":"2.0","result":[{"groupid":"5","name":"Discovered hosts"},{"groupid":"7","name":"Hypervisors"},{"groupid":"2","name":"Linux servers"},{"groupid":"1","name":"Templates"},{"groupid":"6","name":"Virtual machines"},{"groupid":"4","name":"Zabbix servers"}],"id":0}
3 host.get方法获取单个主机组下所有的主机ID。

根据标题2中获取到的主机组id,把主机组id填入到下边脚本中,就可以获得该主机组下所有的主机id。

官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/host/get

python脚本:

[root@Xururu ~]# vim get_group_one.py

 

#!/usr/bin/env python2.7

#coding=utf-8

import json

import urllib2

from urllib2 import URLError

# based url and required header

url = "http://127.0.0.1/zabbix/api_jsonrpc.php"

header = {"Content-Type":"application/json"}

# request json

data = json.dumps(

{

   "jsonrpc":"2.0",

   "method":"host.get",

   "params":{

       "output":["hostid","name"],

       "groupids":"14", ###修改此处

   },

   "auth":"0c29d9efcee2ce856c41431d0dcd60d9", # theauth id is what auth script returns, remeber it is string

   "id":1,

})

# create request object

request = urllib2.Request(url,data)

for key in header:

   request.add_header(key,header[key])

# get host list

try:

   result = urllib2.urlopen(request)

except URLError as e:

   if hasattr(e, 'reason'):

       print 'We failed to reach a server.'

       print 'Reason: ', e.reason

   elif hasattr(e, 'code'):

       print 'The server could not fulfill the request.'

       print 'Error code: ', e.code

else:

   response = json.loads(result.read())

   result.close()

   print "Number Of Hosts: ", len(response['result'])

   for host in response['result']:

       print "Host ID:",host['hostid'],"HostName:",host['name']

       

python脚本执行结果:

[root@Xururu ~]# python get_group_one.py

Number Of Hosts:  0
curl命令:

[root@Xururu ~]# curl -i -X POST -H'Content-Type: application/json' -d '{"jsonrpc":"2.0","method":"host.get","params":{"output":["hostid","name"],"groupids":"14"},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php

 

curl命令执行结果:

[root@Xururu ~]# curl -i -X POST -H'Content-Type: application/json' -d '{"jsonrpc":"2.0","method":"host.get","params":{"output":["hostid","name"],"groupids":"14"},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php

HTTP/1.1 200 OK

Date: Sun, 13 Aug 2017 02:14:19 GMT

Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16

X-Powered-By: PHP/5.4.16

Access-Control-Allow-Origin: *

Access-Control-Allow-Headers: Content-Type

Access-Control-Allow-Methods: POST

Access-Control-Max-Age: 1000

Content-Length: 36

Content-Type: application/json

 

{"jsonrpc":"2.0","result":[],"id":0}
4. itemsid.get方法获取单个主机下所有的监控项ID

根据标题3中获取到的所有主机id与名称,找到你想要获取的主机id,获取它下面的所有items。

官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/item

python脚本:

[root@Xururu ~]# vim get_items.py

 

#!/usr/bin/env python2.7

#coding=utf-8

import json

import urllib2

from urllib2 import URLError

# based url and required header

url = "http://127.0.0.1/zabbix/api_jsonrpc.php"

header = {"Content-Type":"application/json"}

# request json

data = json.dumps(

{

   "jsonrpc":"2.0",

   "method":"item.get",

   "params":{

       "output":["itemids","key_"],

       "hostids":"10146",###修改此处

   },

   "auth":"0c29d9efcee2ce856c41431d0dcd60d9", # theauth id is what auth script returns, remeber it is string

   "id":1,

})

# create request object

request = urllib2.Request(url,data)

for key in header:

   request.add_header(key,header[key])

# get host list

try:

   result = urllib2.urlopen(request)

except URLError as e:

   if hasattr(e, 'reason'):

       print 'We failed to reach a server.'

       print 'Reason: ', e.reason

   elif hasattr(e, 'code'):

       print 'The server could not fulfill the request.'

       print 'Error code: ', e.code

else:

   response = json.loads(result.read())

   result.close()

   print "Number Of Hosts: ", len(response['result'])

   for host in response['result']:

       print host

       #print "Host ID:",host['hostid'],"HostName:",host['name']

 

 

python脚本运行结果:

[root@Xururu ~]# python get_items.py

Number Of Hosts:  0
curl命令:

[root@Xururu ~]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc":"2.0","method":"item.get","params":{"output":"itemids","hostids":"10146","search":{"key_":"net.if.out[eth2]"}},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php

 

curl命令执行结果:

[root@Xururu ~]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc":"2.0","method":"item.get","params":{"output":"itemids","hostids":"10146","search":{"key_":"net.if.out[eth2]"}},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php

HTTP/1.1 200 OK

Date: Sun, 13 Aug 2017 02:25:37 GMT

Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16

X-Powered-By: PHP/5.4.16

Access-Control-Allow-Origin: *

Access-Control-Allow-Headers: Content-Type

Access-Control-Allow-Methods: POST

Access-Control-Max-Age: 1000

Content-Length: 36

Content-Type: application/json

 

{"jsonrpc":"2.0","result":[],"id":0}  ### 执行结果
5. history.get方法获取单个监控项的历史数据

根据第4项的获取到的所有items id的值,找到想要监控的那项,获取它的历史数据。

官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/history/get

python脚本:

[root@Xururu ~]# vim get_items_history.py

 

#!/usr/bin/env python2.7

#coding=utf-8

import json

import urllib2

from urllib2 import URLError

# based url and required header

url = "http://127.0.0.1/zabbix/api_jsonrpc.php"

header = {"Content-Type":"application/json"}

# request json

data = json.dumps(

{

   "jsonrpc":"2.0",

   "method":"history.get",

   "params":{

       "output":"extend",

       "history":3,

       "itemids":"25159",

       "limit":10

   },

   "auth":"0c29d9efcee2ce856c41431d0dcd60d9", # theauth id is what auth script returns, remeber it is string

   "id":1,

})

# create request object

request = urllib2.Request(url,data)

for key in header:

   request.add_header(key,header[key])

# get host list

try:

   result = urllib2.urlopen(request)

except URLError as e:

   if hasattr(e, 'reason'):

       print 'We failed to reach a server.'

       print 'Reason: ', e.reason

   elif hasattr(e, 'code'):

       print 'The server could not fulfill the request.'

       print 'Error code: ', e.code

else:

   response = json.loads(result.read())

   result.close()

   print "Number Of Hosts: ", len(response['result'])

   for host in response['result']:

       print host

       #print "Host ID:",host['hostid'],"HostName:",host['name']

 

 

Python脚本执行结果:

[root@Xururu ~]# python get_items_history.py

Number Of Hosts:  0

 
curl命令:

[root@Xururu ~]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc":"2.0","method":"history.get","params":{"history":3,"itemids":"25154","output":"extend","limit":10},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php

 

curl命令执行结果:

[root@Xururu ~]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc":"2.0","method":"history.get","params":{"history":3,"itemids":"25154","output":"extend","limit":10},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php

HTTP/1.1 200 OK

Date: Sun, 13 Aug 2017 02:34:44 GMT

Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16

X-Powered-By: PHP/5.4.16

Access-Control-Allow-Origin: *

Access-Control-Allow-Headers: Content-Type

Access-Control-Allow-Methods: POST

Access-Control-Max-Age: 1000

Content-Length: 36

Content-Type: application/json

 

{"jsonrpc":"2.0","result":[],"id":0}

 

以上便是整个项目调用zabbix,所需要的资料,最好是自己看下官方手册,中间遇到的很多问题,我也是在官方手册中找到了答案。

通过上面的分析:
下面进行一个实例数据获取到展现:

def getfshomeused(*args, **b):
    '''
    获取home分区使用大小
    '''
    diskhome_data = json.dumps({
        "jsonrpc": "2.0",
        "method": "item.get",
        "params": {
            "output": "extend",
            "hostids": b["parameter"],
            "search": {
                "key_": "vfs.fs.size[/home,used]"  # 只查询磁盘的homeused
            }
        },
        "auth": b["session"],
        "id": 2
    })
    return diskhome_data





        '''获取home目录used空间'''
        fshomeused_dict = dataHandle(func=getfshomeused, hostid=hostid)
'''进行遍历'''
 for i in fshomeused_dict:
            fshomeused_now = i['prevvalue']  # home分区使用量
 '''返回的前端的字典'''
    monitor_dict = {
        "fshomeused_now": fshomeused_now,  # home partation used
    }
    return render(request, 'Monitor.html', monitor_dict)

在这里插入图片描述

这是前端展示核心代码:

 // ####################  【Home分区】图形  ####################
                    // 基于准备好的dom,初始化echarts实例
                    // Home分区使用饼图
                    var myChart_fshomesize = echarts.init(document.getElementById('main_fshomesize'));
                    option_fshomesize = {
                        title:
                            {
                                text: 'Home分区使用情况',
                                subtext: 'home分区单位MB',
                                x: 'center'
                            },
                        tooltip:
                            {
                                trigger: 'item',
                                formatter: "{a} <br/>{b} : {c} ({d}%)"
                            },
                        legend:
                            {
                                orient: 'vertical',
                                left: 'left',
                                data: ['home分区空闲', 'home分区用量']
                            },
                        series: [
                            {
                                name: '分区情况',
                                type: 'pie',
                                radius: ['50%', "70"],
                                avoidLabelOverlap: false,
                                label: {
                                    normal: {
                                        show: false,
                                        position: 'center',
                                        fontSize: 14
                                    },
                                    emphasis: {
                                        show: true,
                                        textStyle: {
                                            fontSize: '30',
                                            fontWeight: 'bold'
                                        }
                                    }
                                },

                                data: [
                                    {value: {{ fshomefree_now }}, name: 'home分区空闲'},
                                    {value: {{ fshomeused_now }}, name: 'home分区用量', itemStyle: {color: "#00CC00"}}
                                ]
                            }
                        ]
                    };
                    myChart_fshomesize.showLoading();  //显示loading
                    setInterval(function () {
                        myChart_fshomesize.hideLoading();  //显示完成后不显示loading
                        option_fshomesize.series[0].data[0].value = (({{ fshomefree_now }}) / 1048576).toFixed(2) - 0;
                        option_fshomesize.series[0].data[1].value = (({{ fshomeused_now }}) / 1048576).toFixed(2) - 0;
                        myChart_fshomesize.setOption(option_fshomesize, true);
                    }, 2000);

在这里插入图片描述
我这里方便清晰展示进行了单位换算,换算后的单位为Mb,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
好了,以上内容有些多,但是把整个API接口如何使用,和如何获取到数据,并收集数据,再传到前台进行Echarts数据展示,进行了综合解释。感兴趣的可以多尝试尝试。。。。。

要使用Python调用Zabbix API批量查询主机的信息,您需要进行以下步骤: 1. 安装 `zabbix-api` 模块:您可以使用 `pip` 命令安装该模块,例如:`pip install zabbix-api` 2. 导入必要的和模块: ```python from pyzabbix import ZabbixAPI import json ``` 3. 创建 `ZabbixAPI` 对象并登录: ```python zabbix_server = "http://zabbix.example.com" zabbix_user = "username" zabbix_password = "password" zapi = ZabbixAPI(url=zabbix_server, user=zabbix_user, password=zabbix_password) zapi.login() ``` 4. 使用 `host.get` 方法批量查询主机信息: ```python hosts = zapi.host.get(output=['hostid', 'host', 'name', 'status', 'ip']) ``` 此时,变量 `hosts` 将包含所有主机的信息。在这个示例中,我们查询了每个主机的 `hostid`、`host`、`name`、`status` 和 `ip` 信息。 5. 处理查询结果: ```python for host in hosts: print("Host ID:", host['hostid']) print("Host Name:", host['name']) print("Host Status:", host['status']) print("Host IP:", host['ip']) print("------------------------") ``` 以上代码将遍历每个主机,并打印出其 ID、名称、状态和 IP 地址。 完整代码示例: ```python from pyzabbix import ZabbixAPI import json zabbix_server = "http://zabbix.example.com" zabbix_user = "username" zabbix_password = "password" zapi = ZabbixAPI(url=zabbix_server, user=zabbix_user, password=zabbix_password) zapi.login() hosts = zapi.host.get(output=['hostid', 'host', 'name', 'status', 'ip']) for host in hosts: print("Host ID:", host['hostid']) print("Host Name:", host['name']) print("Host Status:", host['status']) print("Host IP:", host['ip']) print("------------------------") ``` 注意:在实际使用中,您可能需要根据具体情况修改查询的参数和返回结果的处理方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

抛物线.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值