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台機器顯示有類型、操作系統、序列號、標簽等。可以點擊某一台進入查看詳細的資產信息。

 

 詳細的資產信息。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM