Zabbix使用python批量添加主机及主机资产信息-从零到无
阅读原文时间:2023年07月08日阅读:1

- - 时间: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台机器显示有类型、操作系统、序列号、标签等。可以点击某一台进入查看详细的资产信息。

详细的资产信息。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章