探索Zabbix API:導(dǎo)出主機(jī)組及主機(jī)信息
探索Zabbix API:企業(yè)監(jiān)控管理工具
在上一篇文章《探索Zabbix API(一):企業(yè)監(jiān)控管理工具》中,我們初步了解了Zabbix API的基本使用方法和創(chuàng)建主機(jī)。本文將繼續(xù)探索Zabbix API,看如何利用它來導(dǎo)出主機(jī)組及主機(jī)信息。
一、使用場景
系統(tǒng)管理員管理數(shù)千臺主機(jī),當(dāng)需要導(dǎo)出某個(gè)項(xiàng)目用了多少臺主機(jī),包含哪些IP,我們就可以從zabbix的主機(jī)群組中拿到這些信息。
二、導(dǎo)出主機(jī)組及主機(jī)信息
步驟一:獲取API訪問令牌
在使用Zabbix API之前,首先需要獲取一個(gè)API訪問令牌(Authentication Token)。這個(gè)令牌將用于對Zabbix API進(jìn)行身份驗(yàn)證和授權(quán)。
要獲取API訪問令牌,參考上一篇文章:《探索Zabbix API(一):企業(yè)監(jiān)控管理工具》
步驟二:編寫Python腳本,該腳本主要有三個(gè)函數(shù)組成
獲取主機(jī)ID函數(shù)
??獲取所有主機(jī)組ID
def get_group_name(auth):
data = {
'jsonrpc': '2.0',
'method': 'hostgroup.get',
'params': {
"output": ["groupid", "name"]
},
'auth': auth,
'id': 2
}
response = requests.post(url=ApiUrl, headers=header, jsnotallow=data)
result = json.loads(response.content)
group_names = result["result"]
return group_names
函數(shù)解析:
- 'method': 'hostgroup.get' :指定了要調(diào)用的 Zabbix API 方法,這里是獲取主機(jī)組信息。
- 'params': 是方法的參數(shù),這里要求返回主機(jī)組的 groupid 和 name。
- result = json.loads(response.content):這里將API的響應(yīng)內(nèi)容(JSON)加載為Python字典,方便后續(xù)處理。
- group_names = result["result"]:從API的響應(yīng)中提取出了主機(jī)組的信息,并將其存儲在group_names變量中。
- return group_names:最后,將獲取到的主機(jī)組信息返回給調(diào)用者。
獲取主機(jī)組信息函數(shù)
??使用第一個(gè)函數(shù)拿到的主機(jī)組ID,經(jīng)此函數(shù)處理拿到主機(jī)組名和主機(jī)信息。
def get_hosts_in_group(group_id, auth):
data = {
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": ["name", "interfaces"],
"groupids": group_id,
"filter": {
"status": "0"
},
"selectInterfaces": ["ip"],
},
"id": 1,
"auth": auth
}
response = requests.post(url=ApiUrl, headers=header, jsnotallow=data)
result = json.loads(response.content)
hosts = result["result"]
return hosts
函數(shù)解析:
- 'method': 'host.get': 指定要調(diào)用的 Zabbix API 方法,這里是獲取主機(jī)信息。
- 'params': {...} :表示要返回主機(jī)的 name(主機(jī)名) 和 interfaces(接口信息)。
- 'groupids': group_id :指定了要獲取的主機(jī)所屬的主機(jī)組,這里使用了傳入的 group_id 參數(shù)。
- 'filter': {"status": "0"} :指定了一個(gè)過濾條件,這里要求只返回狀態(tài)為正常的主機(jī)。
- 'selectInterfaces': ["ip"]: 指定了要返回主機(jī)接口的IP地址。
- headers=header :可能在代碼的其他地方定義了一個(gè)包含請求頭信息的 header 字典。
- jsnotallow=data :將前面定義的 data 字典轉(zhuǎn)換成了JSON格式,并作為POST請求的內(nèi)容發(fā)送給API。
- hosts = result["result"]:從API的響應(yīng)中提取出了主機(jī)信息,并將其存儲在 hosts 變量中。
寫入CSV函數(shù)
??通過第二個(gè)函數(shù)拿到的主機(jī)組信息和主機(jī)信息寫入到csv表格中:
def export_host_info(group_names, auth):
with open('host_info.csv', 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.DictWriter(f, fieldnames=["Group", "Hostname", "IP"])
writer.writeheader()
for group in group_names:
group_id = group['groupid']
group_name = group['name']
hosts = get_hosts_in_group(group_id, auth)
for host in hosts:
hostname = host['name']
ip = host['interfaces'][0]['ip']
writer.writerow({"Group": group_name, "Hostname": hostname, "IP": ip})
函數(shù)解析:
- with open('host_info.csv', 'w', newline='', encoding='utf-8-sig') as f:打開一個(gè)名為 host_info.csv 的CSV文件,準(zhǔn)備寫入數(shù)據(jù)。
- w:表示以寫入模式打開文件;
- newline=' ': 指定在寫入CSV文件時(shí)不添加額外的空行;
- encoding='utf-8-sig' :表示以UTF-8編碼寫入文件。
- writer = csv.DictWriter(f, fieldnames=["Group", "Hostname", "IP"]):創(chuàng)建一個(gè)CSV寫入器,指定了字段名為 "Group"、"Hostname" 和 "IP"。
- writer.writeheader():寫入CSV文件的表頭(即字段名)。
- for group in group_names:遍歷傳入的主機(jī)組信息列表。
- group_id = group['groupid'] 和 group_name = group['name']:提取出主機(jī)組的ID和名稱。
- hosts = get_hosts_in_group(group_id, auth):調(diào)用之前定義的 get_hosts_in_group 函數(shù),獲取該主機(jī)組內(nèi)的所有主機(jī)信息。
- for host in hosts:遍歷該主機(jī)組內(nèi)的所有主機(jī)信息。
- hostname = host['name'] 和 ip = host['interfaces'][0]['ip']:提取出主機(jī)的名稱和IP地址。這里假設(shè)每個(gè)主機(jī)只有一個(gè)接口,因此使用了 [0] 來獲取第一個(gè)接口的IP地址。
- writer.writerow({"Group": group_name, "Hostname": hostname, "IP": ip}):將提取出的信息寫入到CSV文件中。
三、結(jié)論
通過Zabbix API,我們可以輕松地獲取和導(dǎo)出主機(jī)組及主機(jī)信息,從而實(shí)現(xiàn)更高效的系統(tǒng)管理和監(jiān)控。本文章介紹了如何使用Python編寫函數(shù)來調(diào)用Zabbix API,從而實(shí)現(xiàn)主機(jī)組及主機(jī)信息的導(dǎo)出。下一篇文章我將介紹如何根據(jù)主機(jī)組和主機(jī)信息,自定義導(dǎo)出主機(jī)資源使用率,根據(jù)這些信息我們能生成日報(bào)等內(nèi)容。