- - 時間:2020年11月10日
- - 作者:飛翔的小胖豬
前言:
使用zabbix作為基礎環境的監控系統時,面對現網在用的2000+台把這些主機添加到zabbix監控中是一個問題,當然zabbix有自動發現的規則,但是應客戶要求需要為每個資源填寫特定的資產標簽,在zabbix的管理頁面上暫時沒有發現可行的辦法。文章使用python程序調用zabbix自帶的API實現批量的主機資源添加,包括對應的資產項。(添加主機資源時不填入資產的標簽方法,建議使用zabbix自帶的服務發現)
文檔最終實現的功能是用戶把需要添加到zabbix的資源填入execl的對應列中,然后執行python程序實現批量添加host的目的。
環境說明
zabbix服務端安裝在Centos 7.6操作系統上,版本為4.4。
python使用的是3.9的版本,安裝在win上。
步驟說明
1.填寫execl表格
2.按需修改該python腳本中的create_host_vm函數中的inventory的內容。
3.執行腳本實現主機添加,並確認主機添加情況。
文件說明
1.表示HOST INVENTORY清單中的項。
2.客戶現場實際數據填入。
3.python程序里create_host_vm函數inventory項值 i的下標。各位可以根據自己的實際情況增減python腳本中的值的寫入。
(在寫入數據的時候execl中的最后兩行可以不用刪除,方便用戶自定義數據時做參考,但是一定要放在最后,因為我的python腳本很簡潔沒有異常處理和判斷)
ps:這個execl表可以自己梳理,也可以私信我獲取。
官方的列表對應:

#此處的ID號和EXECL中ID沒有任何關系,這個數據是從官網截出來的。 https://www.zabbix.com/documentation/4.4/manual/api/reference/host/object#host_inventory ID Property Type Description 4 alias string Alias. 11 asset_tag string Asset tag. 28 chassis string Chassis. 23 contact string Contact person. 32 contract_number string Contract number. 47 date_hw_decomm string HW decommissioning date. 46 date_hw_expiry string HW maintenance expiry date. 45 date_hw_install string HW installation date. 44 date_hw_purchase string HW purchase date. 34 deployment_status string Deployment status. 14 hardware string Hardware. 15 hardware_full string Detailed hardware. 39 host_netmask string Host subnet mask. 38 host_networks string Host networks. 40 host_router string Host router. 30 hw_arch string HW architecture. 33 installer_name string Installer name. 24 location string Location. 25 location_lat string Location latitude. 26 location_lon string Location longitude. 12 macaddress_a string MAC address A. 13 macaddress_b string MAC address B. 29 model string Model. 3 name string Name. 27 notes string Notes. 41 oob_ip string OOB IP address. 42 oob_netmask string OOB host subnet mask. 43 oob_router string OOB router. 5 os string OS name. 6 os_full string Detailed OS name. 7 os_short string Short OS name. 61 poc_1_cell string Primary POC mobile number. 58 poc_1_email string Primary email. 57 poc_1_name string Primary POC name. 63 poc_1_notes string Primary POC notes. 59 poc_1_phone_a string Primary POC phone A. 60 poc_1_phone_b string Primary POC phone B. 62 poc_1_screen string Primary POC screen name. 68 poc_2_cell string Secondary POC mobile number. 65 poc_2_email string Secondary POC email. 64 poc_2_name string Secondary POC name. 70 poc_2_notes string Secondary POC notes. 66 poc_2_phone_a string Secondary POC phone A. 67 poc_2_phone_b string Secondary POC phone B. 69 poc_2_screen string Secondary POC screen name. 8 serialno_a string Serial number A. 9 serialno_b string Serial number B. 48 site_address_a string Site address A. 49 site_address_b string Site address B. 50 site_address_c string Site address C. 51 site_city string Site city. 53 site_country string Site country. 56 site_notes string Site notes. 55 site_rack string Site rack location. 52 site_state string Site state. 54 site_zip string Site ZIP/postal code. 16 software string Software. 18 software_app_a string Software application A. 19 software_app_b string Software application B. 20 software_app_c string Software application C. 21 software_app_d string Software application D. 22 software_app_e string Software application E. 17 software_full string Software details. 10 tag string Tag. 1 type string Type. 2 type_full string Type details. 35 url_a string URL A. 36 url_b string URL B. 37 url_c string URL C. 31 vendor string Vendor.
具體實施
python腳本

from zabbix_api import ZabbixAPI import urllib3 import sys import json import xlrd import requests url = 'http://192.168.111.124/zabbix/api_jsonrpc.php' headers = {'Content-Type': 'application/json-rpc'} server_ip= '192.168.111.124' # 獲取token def getToken(username, passwd): username = username passwd = passwd data = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": username, "password": passwd }, "id": 1 } request = requests.post(url=url,headers=headers,data=json.dumps(data)) dict = json.loads(request.text) print('第一次獲取到的token為:',dict['result']) return dict['result'] #獲取模板ID,傳遞一個token值和模板名輸出對應的模板id號。查出來的id號可用在后續創建主機時填入模板號。 def get_temp_id(token_num,temp_name): temp_data = { "jsonrpc": "2.0", "method": "template.get", "params": { "output": "extend", "filter": { "host": [ temp_name, ] } }, "auth": token_num, "id": 1, } request = requests.post(url=url,headers=headers,data=json.dumps(temp_data)) dict = json.loads(request.text) cc = dict['result'][0]['templateid'] return cc #獲取主機組ID,傳遞一個token值和主機名輸出對應的模板id號。查出來的id號可用在后續創建主機時填入主機號。 def get_hostgroup_id(token_num,hostgroup_name): print("程序接收到的token為:",token_num) group_info = { "jsonrpc": "2.0", "method": "hostgroup.get", "params": { "output": "extend", "filter": { "name": [ hostgroup_name, ] } }, "auth": token_num, "id": 1 } request = requests.post(url=url, headers=headers,data=json.dumps(group_info)) dict = json.loads(request.text) # ff=dict2['result'] r_group_id = dict['result'][0]['groupid'] return r_group_id #創建主機,並添加主機資產信息。 #通過傳遞一個token和一個字典過來,字典中包括了很多主機相關的信息。 def create_host(token_num,host_info): new_host = { "jsonrpc": "2.0", "method": "host.create", "params": { "host": "test_lvs1", #使用host_info字典中的hostname字段填入。 "interfaces": [ { "type": 1, "main": 1, "useip": 1, "ip": "192.168.111.11", #使用host_info字典中的ip字段填入。 "dns": "", "port": "10050" #默認使用10050端口 } ], "groups": [ { "groupid": "2" #使用host_info字段中的groupid字段填入。 } ], "templates": [ { "templateid": "10001" #使用host_info字段中的templateid字段填入。 } ], "inventory_mode": 0, "inventory": { #填入資產相關的內容,具體字段及定義請參考XXXXXXXXXX "macaddress_a": "01234", "macaddress_b": "56768" } }, "auth": token_num, "id": 1 } request = requests.post(url=url, headers=headers, data=json.dumps(new_host)) dict1 = json.loads(request.text) print(dict1) #批量創建主機添加資產信息,虛擬機。 def create_host_vm(token_num,host_info): for i in host_info: new_host = { "jsonrpc": "2.0", "method": "host.create", "params": { "host": i[3], "interfaces": [ { "type": 1, "main": 1, "useip": 1, "ip": i[0], "dns": "", "port": "10050" } ], "groups": [ { "groupid": "2" } ], "templates": [ { "templateid": "10001" } ], "inventory_mode": 0, "inventory": { #此處的字典數據來源execl表,需要execl表的可以聯系我。 "type": i[1], "type_full": i[2], "name": i[3], "os": i[5], "serialno_a": i[8], "tag": i[10], "asset_tag": i[11], "hardware": i[14], "hardware_full": i[15], "software": i[16], "software_full": i[17], "contact": i[23], "location": i[24], "vendor": i[31], "deployment_status": i[34], "host_networks": i[38], "host_netmask": i[39], "host_router": i[40], "oob_ip": i[41], "oob_netmask": i[42], "oob_router": i[43], "date_hw_install": i[45], "site_address_a": i[48], "site_city": i[51], "site_state": i[52], "site_country": i[53], "site_rack": i[55], "site_notes": i[56], "poc_1_name": i[57], "poc_1_email": i[58], "poc_1_phone_a": i[59], "poc_1_cell": i[61], "poc_2_name": i[64], "poc_2_email": i[65], "poc_2_phone_a": i[66], "poc_2_cell": i[68], } }, "auth": token_num, "id": 1 } request = requests.post(url=url, headers=headers, data=json.dumps(new_host)) dict1 = json.loads(request.text) print(dict1) #通過讀取execl中的數據填充到數組中,數組中嵌套字典。 def read_execl_info(execl_dir): host_info_list = list() host_info_dict = {} #xl = xlrd.open_workbook('d:/test.xlsx') xl = xlrd.open_workbook(execl_dir) table = xl.sheets()[0] table_sum_num = table.ncols #print("文檔總列數為:", table_sum_num) table_row_num = table.nrows #print("文檔總行數為:", table_row_num) # 獲取每一個單元格的數據 for i in range(1, table_row_num): # 此處初始化一下字典 host_info_dict = {} #print("此時列表的值:", host_info_list) for j in range(0, table_sum_num): # print(table.cell(i,j).value) host_info_dict[j] = table.cell(i, j).value # 在循環體內一次加入數據到字典中哈哈哈 host_info_list.append(host_info_dict) #print("列表總長度為:", len(host_info_list)) # 取出數據 #for i in host_info_list: # print(i) return host_info_list if __name__ == "__main__": # server_ip = '10.37.149.109' username = 'Admin' passwd = 'zabbix' token_num = getToken(username,passwd) #--------獲取指定主機組ID時使用------------------- #group_name = "Linux servers" #group_id = get_hostgroup_id(token_num,group_name) #print("最終接收到的程序種的groupid為:",group_id) #--------------------------------------------- #--------獲取指定TEMP(模板)ID時使用------------------- #temp_name = "Template OS Linux by Zabbix agent" #temp_id = get_temp_id(token_num,temp_name) #print("最終接收到的程序種的groupid為:",temp_id) #--------------------------------------------- #--------測試獲取execl內容------------------- execl_name = "d:/test.xlsx" host_info_list = read_execl_info(execl_name) #print("最終接收到的程序種的groupid為:",temp_id) #--------------------------------------------- #--------測試使用函數新建主機------------------- #需要取消獲取execl內容的注釋 r_create_host = create_host_vm(token_num,host_info_list)
最后兩行是報錯是因為在execl中我們最后兩行不是實際的數據,只是起到了參考的作用,所以不要慌,這很正常。
結果確認
主機表中能夠看到我們execl表中添加的4台主機。
在zabbix中的資產記錄界面中能夠查看到現在新加入的4台機器顯示有類型、操作系統、序列號、標簽等。可以點擊某一台進入查看詳細的資產信息。
詳細的資產信息。