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

     详细的资产信息。

  • 相关阅读:
    面向对象
    面向对象
    面向对象
    面向对象
    面向对象
    面向对象
    面向对象
    面向对象
    3.1
    面向对象
  • 原文地址:https://www.cnblogs.com/Pigs-Will-Fly/p/13954583.html
Copyright © 2011-2022 走看看