摘要:因為是獲取相關(guān)信息,所以使用這個函數(shù)。這里需要說明的是,我前面獲取的是所有節(jié)點(diǎn)主機(jī)的信息,而我是每獲取完一個節(jié)點(diǎn)主機(jī)就會錄入數(shù)據(jù)庫,所以采用了循環(huán)遍歷所有節(jié)點(diǎn)主機(jī)信息。就指當(dāng)前的主機(jī)信息。
需求背景
在ZABBIX服務(wù)端可以看到各個節(jié)點(diǎn)客戶端主機(jī)的詳細(xì)信息,但是觀察各個節(jié)點(diǎn)時,同一時刻只能觀察到一個,如下圖所示。
現(xiàn)在想將所有節(jié)點(diǎn)主機(jī)的一些信息通過腳本調(diào)用API讀取出來,錄入到數(shù)據(jù)庫,以供其他模塊使用,查了一些相關(guān)資料,將大概思路記錄下來。
實(shí)現(xiàn)方案ZABBIX API的官方網(wǎng)址:https://www.zabbix.com/docume...
Python的zabbix-api網(wǎng)址:https://github.com/gescheit/s...
使用zabbix-api這個python第三方庫讓開發(fā)變得更為簡潔。
1、安裝zabbix-api
首先要安裝這個第三方庫,一個命令就可以搞定:
# pip install zabbix-api
這里使用pip進(jìn)行安裝,沒有安裝pip的童鞋請自行百度安裝pip
2、獲取各個節(jié)點(diǎn)主機(jī)的信息
(1)首先要連接并登錄zabbix服務(wù)端,兩條語句就可以搞定(開源是多么重要呀)
#!/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)
看看,是不是很簡單,當(dāng)然也可以自己寫,有興趣的可以看看相關(guān)資料。此時運(yùn)行一下,可以看到相關(guān)打印:
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,應(yīng)該都知道,表示請求成功了.
(2)獲取節(jié)點(diǎn)主機(jī)
由于我的節(jié)點(diǎn)主機(jī)都在同一"Host groups"下面,因此我一次性獲取全部節(jié)點(diǎn)主機(jī)的信息。好了,這是需要將API文檔拿出來查閱。因為是獲取相關(guān)信息,所以使用hostgroup.get這個API函數(shù)。這個API函數(shù)說明在這里:https://www.zabbix.com/docume...
現(xiàn)在簡單的貼下一代碼:
hostgroup_name = "your host group name" hostids = zapi.hostgroup.get( { "filter": { "name": hostgroup_name }, "selectHosts": ["hostid", "host"] } ) print json.dumps(hostids, indent=4)
在這個json語句中,有個關(guān)鍵參數(shù)filter,查閱官方文檔:
這里只返回名為"hostgroup_name",即你自己的hostgroup分組下面的所有主機(jī)。我這里只返回這些主機(jī)的"hostid"和"host"。
注意,zapi.hostgroup.get返回的是python數(shù)據(jù)結(jié)構(gòu),為了方便調(diào)試代碼,print時注意把python數(shù)據(jù)結(jié)構(gòu)在轉(zhuǎn)化為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" } ]
關(guān)于json.dumps()、json.loads():
json.dumps():dict轉(zhuǎn)為str
json.loads():str轉(zhuǎn)為dict
(3)獲取節(jié)點(diǎn)主機(jī)具體信息
這個就太豐富啦,具體問題看具體API,這里以查看內(nèi)存剩余容量為例吧。
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格式打印的優(yōu)勢就凸顯出來了,”Response Body“為未進(jìn)行json轉(zhuǎn)碼前的python數(shù)據(jù)結(jié)構(gòu)。如果不知道剩余內(nèi)存容量該怎么從memfree_get中取出,可以從打印信息中查看,很顯然,字段"lastvalue"就是最新剩余內(nèi)存值:
memfree_get_last = memfree_get[0]["lastvalue"]
這樣我們就將該值取出,錄入數(shù)據(jù)庫就OK了,獲取其他信息也是同樣的道理。
這里需要說明的是,我前面獲取的是所有節(jié)點(diǎn)主機(jī)的信息,而我是每獲取完一個節(jié)點(diǎn)主機(jī)就會錄入數(shù)據(jù)庫,所以采用了循環(huán)遍歷所有節(jié)點(diǎn)主機(jī)信息。"hostids": [host_cnt["hostid"]]就指當(dāng)前的主機(jī)信息。
總結(jié)1、有問題,看文檔
2、合理利用第三方庫,讓開發(fā)變得更加高效
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/41479.html
摘要:靈活查詢,聚合分組并存除開單純的聚合和分組,還支持聚合和分組的復(fù)合查詢。所以,與會聚合為一條曲線,而和的關(guān)系則是分組的關(guān)系。當(dāng)然,的功能在未來,還遠(yuǎn)遠(yuǎn)不止這些,高效運(yùn)維的時代才剛剛開啟。 運(yùn)維 2.0 時代 運(yùn)維 2.0 是指,從技術(shù)運(yùn)維升級為服務(wù)運(yùn)維,向公司提供可依賴的專業(yè)服務(wù)。運(yùn)維 2.0 強(qiáng)調(diào)服務(wù)交付能力,而不是技術(shù)能力,需求可依賴、懂業(yè)務(wù)、服務(wù)化的專業(yè)運(yùn)維。 為了了解運(yùn)維 2....
摘要:可以指定一個已停止的容器,但是停止的容器不返回任何數(shù)據(jù)。但它并不意味著你的每個容器都能訪問那么多的內(nèi)存默認(rèn)時命令會每隔秒鐘刷新一次,如果只看當(dāng)前狀態(tài)指定查看某個容器的資源可以指定名稱或本文為容器監(jiān)控實(shí)踐系列文章,完整內(nèi)容見 前言 傳統(tǒng)虛機(jī)監(jiān)控一般采用類似Zabbix的方案,但容器出現(xiàn)之后,再使用Zabbix agent來采集數(shù)據(jù)的話就顯得有些吃力了,如果每個容器都像OS那樣監(jiān)控,則me...
摘要:可以指定一個已停止的容器,但是停止的容器不返回任何數(shù)據(jù)。但它并不意味著你的每個容器都能訪問那么多的內(nèi)存默認(rèn)時命令會每隔秒鐘刷新一次,如果只看當(dāng)前狀態(tài)指定查看某個容器的資源可以指定名稱或本文為容器監(jiān)控實(shí)踐系列文章,完整內(nèi)容見 前言 傳統(tǒng)虛機(jī)監(jiān)控一般采用類似Zabbix的方案,但容器出現(xiàn)之后,再使用Zabbix agent來采集數(shù)據(jù)的話就顯得有些吃力了,如果每個容器都像OS那樣監(jiān)控,則me...
閱讀 2504·2021-11-15 11:38
閱讀 1948·2021-11-05 09:37
閱讀 2257·2021-10-08 10:12
閱讀 2807·2019-08-30 15:55
閱讀 2112·2019-08-30 15:52
閱讀 1221·2019-08-29 13:24
閱讀 463·2019-08-26 18:27
閱讀 1473·2019-08-26 18:27