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.
View Code

具体实施

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)
View Code

最后两行是报错是因为在execl中我们最后两行不是实际的数据,只是起到了参考的作用,所以不要慌,这很正常。

结果确认

主机表中能够看到我们execl表中添加的4台主机。

 在zabbix中的资产记录界面中能够查看到现在新加入的4台机器显示有类型、操作系统、序列号、标签等。可以点击某一台进入查看详细的资产信息。

 详细的资产信息。

原文地址:https://www.cnblogs.com/Pigs-Will-Fly/p/13954583.html