Zabbix使用python批量添加主机及主机资产信息-从零到无
- - 时间: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台机器显示有类型、操作系统、序列号、标签等。可以点击某一台进入查看详细的资产信息。
详细的资产信息。