资讯专栏INFORMATION COLUMN

调用ZABBIX的API获取节点主机信息小记

Maxiye / 1323人阅读

摘要:因为是获取相关信息,所以使用这个函数。这里需要说明的是,我前面获取的是所有节点主机的信息,而我是每获取完一个节点主机就会录入数据库,所以采用了循环遍历所有节点主机信息。就指当前的主机信息。

需求背景

在ZABBIX服务端可以看到各个节点客户端主机的详细信息,但是观察各个节点时,同一时刻只能观察到一个,如下图所示。

现在想将所有节点主机的一些信息通过脚本调用API读取出来,录入到数据库,以供其他模块使用,查了一些相关资料,将大概思路记录下来。

实现方案

ZABBIX API的官方网址:https://www.zabbix.com/docume...
Python的zabbix-api网址:https://github.com/gescheit/s...
使用zabbix-api这个python第三方库让开发变得更为简洁。

1、安装zabbix-api
首先要安装这个第三方库,一个命令就可以搞定:

# pip install zabbix-api

这里使用pip进行安装,没有安装pip的童鞋请自行百度安装pip

2、获取各个节点主机的信息
(1)首先要连接并登录zabbix服务端,两条语句就可以搞定(开源是多么重要呀)

#!/usr/bin/env python
#coding=utf-8

from zabbix_api import ZabbixAPI

server = "your server address"
username = "your user name"
password = "your password"

zapi = ZabbixAPI(server=server, path="", log_level=6)
zapi.login(username, password)

看看,是不是很简单,当然也可以自己写,有兴趣的可以看看相关资料。此时运行一下,可以看到相关打印:

20: url: http://xxxxx/zabbix//api_jsonrpc.php
10: Trying to login with "xxxxx":"md5(xxxxx)"
10: json_obj: {"params": {"password": "xxxxx", "user": "xxxxx"}, "jsonrpc": "2.0", "method": "user.login", "id": 0}
20: Sending: {"params": {"password": "xxxxx", "user": "xxxxx"}, "jsonrpc": "2.0", "method": "user.login", "id": 0}
10: Sending headers: {"Content-Type": "application/json-rpc", "User-Agent": "python/zabbix_api"}
20: Response Code: 200
10: Response Body: {u"jsonrpc": u"2.0", u"result": u"271eca6ecbd4640c33f822cfaea4f0b5", u"id": 0}

Response Code为200,应该都知道,表示请求成功了.

(2)获取节点主机
由于我的节点主机都在同一"Host groups"下面,因此我一次性获取全部节点主机的信息。好了,这是需要将API文档拿出来查阅。因为是获取相关信息,所以使用hostgroup.get这个API函数。这个API函数说明在这里:https://www.zabbix.com/docume...
现在简单的贴下一代码:

hostgroup_name = "your host group name"

hostids = zapi.hostgroup.get(
                              {
                                  "filter": 
                                  {
                                      "name": hostgroup_name
                                  }, 
                                  "selectHosts": ["hostid", "host"]
                              }
                             )
print json.dumps(hostids, indent=4)

在这个json语句中,有个关键参数filter,查阅官方文档:

这里只返回名为"hostgroup_name",即你自己的hostgroup分组下面的所有主机。我这里只返回这些主机的"hostid"和"host"。
注意,zapi.hostgroup.get返回的是python数据结构,为了方便调试代码,print时注意把python数据结构在转化为json文件,打印信息如下。

10: json_obj: {"params": {"filter": {"name": "xxxxx"}, "selectHosts": ["hostid", "host"]}, "jsonrpc": "2.0", "method": "hostgroup.get", "auth": u"af7401886734c31defdface109ed171e", "id": 1}
20: Sending: {"params": {"filter": {"name": "xxxxx"}, "selectHosts": ["hostid", "host"]}, "jsonrpc": "2.0", "method": "hostgroup.get", "auth": "af7401886734c31defdface109ed171e", "id": 1}
10: Sending headers: {"Content-Type": "application/json-rpc", "User-Agent": "python/zabbix_api"}
20: Response Code: 200
10: Response Body: {u"jsonrpc": u"2.0", u"result": [{u"hosts": [{u"host": u"pc00000011.mknode.cn", u"hostid": u"10274"}, {u"host": u"pc00000013.mknode.cn", u"hostid": u"10275"}, {u"host": u"pc00000015.mknode.cn", u"hostid": u"10276"}, {u"host": u"pc00000012.mknode.cn", u"hostid": u"10277"}, {u"host": u"pc00000016.mknode.cn", u"hostid": u"10278"},  u"internal": u"0", u"flags": u"0", u"groupid": u"15", u"name": u"xxxxx"}], u"id": 1}
[
    {
        "hosts": [
            {
                "host": "pc00000011.mknode.cn", 
                "hostid": "10274"
            }, 
            {
                "host": "pc00000013.mknode.cn", 
                "hostid": "10275"
            }, 
            {
                "host": "pc00000015.mknode.cn", 
                "hostid": "10276"
            }, 
            {
                "host": "pc00000012.mknode.cn", 
                "hostid": "10277"
            }, 
            {
                "host": "pc00000016.mknode.cn", 
                "hostid": "10278"
            }, 
        ], 
        "internal": "0", 
        "flags": "0", 
        "groupid": "15", 
        "name": "xxxxx"
    }
]

关于json.dumps()、json.loads():
json.dumps():dict转为str
json.loads():str转为dict

(3)获取节点主机具体信息
这个就太丰富啦,具体问题看具体API,这里以查看内存剩余容量为例吧。

memfree_get = zapi.item.get(
                             {
                                "hostids": [host_cnt["hostid"]],
                                "filter": {
                                            "key_": ["vm.memory.size[available]"]
                                             # "name": ["Available memory"]
            }
    })
    memfree_get_last = memfree_get[0]["lastvalue"]
    print json.dumps(memfree_get,indent=4)

查看打印信息:

10: Response Body: {u"jsonrpc": u"2.0", u"result": [{u"itemid": u"29401", u"username": u"", u"snmpv3_contextname": u"", u"inventory_link": u"0", u"mtime": u"0", u"authtype": u"0", u"trends": u"365d", u"snmpv3_authpassphrase": u"", u"snmp_oid": u"", u"snmpv3_securitylevel": u"0", u"port": u"", u"lastns": u"31272984", u"master_itemid": u"0", u"logtimefmt": u"", u"jmx_endpoint": u"", u"delay": u"1m", u"publickey": u"", u"state": u"0", u"params": u"", u"snmpv3_securityname": u"", u"formula": u"", u"type": u"7", u"snmpv3_authprotocol": u"0", u"prevvalue": u"3426082816", u"status": u"0", u"lastlogsize": u"0", u"lastclock": u"1523192709", u"snmp_community": u"", u"description": u"Available memory is defined as free+cached+buffers memory.", u"evaltype": u"0", u"trapper_hosts": u"", u"lastvalue": u"3425476608", u"units": u"B", u"value_type": u"3", u"templateid": u"22181", u"snmpv3_privprotocol": u"0", u"password": u"", u"interfaceid": u"0", u"snmpv3_privpassphrase": u"", u"hostid": u"10276", u"key_": u"vm.memory.size[available]", u"name": u"Available memory", u"privatekey": u"", u"lifetime": u"0", u"valuemapid": u"0", u"flags": u"0", u"error": u"", u"ipmi_sensor": u"", u"history": u"1w"}], u"id": 19}
[
    {
        "itemid": "29401", 
        "username": "", 
        "snmpv3_contextname": "", 
        "inventory_link": "0", 
        "mtime": "0", 
        "authtype": "0", 
        "trends": "365d", 
        "snmpv3_authpassphrase": "", 
        "snmp_oid": "", 
        "snmpv3_securitylevel": "0", 
        "port": "", 
        "lastns": "31272984", 
        "master_itemid": "0", 
        "logtimefmt": "", 
        "jmx_endpoint": "", 
        "delay": "1m", 
        "publickey": "", 
        "state": "0", 
        "params": "", 
        "snmpv3_securityname": "", 
        "formula": "", 
        "type": "7", 
        "snmpv3_authprotocol": "0", 
        "prevvalue": "3426082816", 
        "status": "0", 
        "lastlogsize": "0", 
        "lastclock": "1523192709", 
        "snmp_community": "", 
        "description": "Available memory is defined as free+cached+buffers memory.", 
        "evaltype": "0", 
        "trapper_hosts": "", 
        "lastvalue": "3425476608", 
        "units": "B", 
        "value_type": "3", 
        "templateid": "22181", 
        "snmpv3_privprotocol": "0", 
        "password": "", 
        "interfaceid": "0", 
        "snmpv3_privpassphrase": "", 
        "hostid": "10276", 
        "key_": "vm.memory.size[available]", 
        "name": "Available memory", 
        "privatekey": "", 
        "lifetime": "0", 
        "valuemapid": "0", 
        "flags": "0", 
        "error": "", 
        "ipmi_sensor": "", 
        "history": "1w"
    }
]

这次以json格式打印的优势就凸显出来了,”Response Body“为未进行json转码前的python数据结构。如果不知道剩余内存容量该怎么从memfree_get中取出,可以从打印信息中查看,很显然,字段"lastvalue"就是最新剩余内存值:

memfree_get_last = memfree_get[0]["lastvalue"]

这样我们就将该值取出,录入数据库就OK了,获取其他信息也是同样的道理。

这里需要说明的是,我前面获取的是所有节点主机的信息,而我是每获取完一个节点主机就会录入数据库,所以采用了循环遍历所有节点主机信息。"hostids": [host_cnt["hostid"]]就指当前的主机信息。

总结

1、有问题,看文档
2、合理利用第三方库,让开发变得更加高效

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41479.html

相关文章

  • 运维 2.0 时代:数据聚合和分组

    摘要:灵活查询,聚合分组并存除开单纯的聚合和分组,还支持聚合和分组的复合查询。所以,与会聚合为一条曲线,而和的关系则是分组的关系。当然,的功能在未来,还远远不止这些,高效运维的时代才刚刚开启。 运维 2.0 时代 运维 2.0 是指,从技术运维升级为服务运维,向公司提供可依赖的专业服务。运维 2.0 强调服务交付能力,而不是技术能力,需求可依赖、懂业务、服务化的专业运维。 为了了解运维 2....

    skinner 评论0 收藏0
  • 容器监控实践—Docker原生

    摘要:可以指定一个已停止的容器,但是停止的容器不返回任何数据。但它并不意味着你的每个容器都能访问那么多的内存默认时命令会每隔秒钟刷新一次,如果只看当前状态指定查看某个容器的资源可以指定名称或本文为容器监控实践系列文章,完整内容见 前言 传统虚机监控一般采用类似Zabbix的方案,但容器出现之后,再使用Zabbix agent来采集数据的话就显得有些吃力了,如果每个容器都像OS那样监控,则me...

    mushang 评论0 收藏0
  • 容器监控实践—Docker原生

    摘要:可以指定一个已停止的容器,但是停止的容器不返回任何数据。但它并不意味着你的每个容器都能访问那么多的内存默认时命令会每隔秒钟刷新一次,如果只看当前状态指定查看某个容器的资源可以指定名称或本文为容器监控实践系列文章,完整内容见 前言 传统虚机监控一般采用类似Zabbix的方案,但容器出现之后,再使用Zabbix agent来采集数据的话就显得有些吃力了,如果每个容器都像OS那样监控,则me...

    muddyway 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<