需求背景
在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、合理利用第三方库,让开发变得更加高效
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。