【5.0対応済】Python3でZabbix API – ホストインベントリの登録

Python,Zabbix,Zabbix API

こんにちは。プラットフォーム技術部の斉藤 翔平です。

前回の記事ではホストにホストインターフェースを登録する方法について説明しました。今回はホストにホストインベントリを登録する方法について解説します。

ホストインベントリはホストごとに対象機器のハードウェア情報、設置場所や連絡先などのさまざまな情報を設定できます。
そして設定した情報は、Webコンソール上のフィルターや障害通知メールの本文などで活用できます。

例えばWebコンソール上では、「監視データ-障害」や「インベントリ-ホスト」の画面でフィルターとして使用でき、もしOSやミドルウェアの脆弱性、ハードウェアやファームウェアの不具合などが発見された場合は「インベントリ-ホスト」の画面から迅速に該当機器を集計できます。

また障害通知メールでは、アクションの実行内容でホストインベントリ情報のマクロ指定が可能となり、メール本文にホストごとの詳細な情報を追加できるようになります。
詳細な情報を障害通知メールに載せることで、運用者がメールを読むだけで対応に必要なホスト情報を素早く取得でき、障害対応時の初動を早められるといったメリットがあります。

これらのようにホストインベントリを設定し活用することで、脆弱性、不具合の対応や障害発生後の対応などさまざまな場面でメリットを享受できます。

それでは実際にZabbix APIを用いてホストインベントリを登録する方法を紹介します。

この記事の実装サンプルでは、以前の記事で実装した内容を再利用して説明しています。Googleなどの検索結果から直接この記事に訪れた方は、一度、以下の記事を読んでいただけますと幸いです。

ホストインベントリの情報を登録する

ホストインベントリの登録には、2種類の方法があります。1つ目はホストの登録時にホストインベントリも登録する方法、2つ目は登録済みのホストにホストインベントリを追加する方法です。

ホストの登録時にホストインベントリを登録する

使用するメソッドは、host.createです。公式のマニュアルはこちらです。

要求フォーマット

{
    "jsonrpc": "2.0",
    "method": "host.create",
    "params": {
        "host": "Linux server",
        "interfaces": [
            {
                "type": 1,
                "main": 1,
                "useip": 1,
                "ip": "192.168.3.1",
                "dns": "",
                "port": "10050"
            }
        ],
        "groups": [
            {
                "groupid": "50"
            }
        ],
        "tags": [
            {
                "tag": "Host name",
                "value": "Linux server"
            }
        ],
        "templates": [
            {
                "templateid": "20045"
            }
        ],
        "macros": [
            {
                "macro": "{$USER_ID}",
                "value": "123321"
            }
        ],
        "inventory_mode": 0,
        "inventory": {
            "macaddress_a": "01234",
        }
    },
    "auth": "********************************",
    "id": 1
}

ホストを登録する方法ではホストグループとホストインターフェースを設定しましたが、パラメーターを追加することによってタグ、テンプレート、マクロならびにホストインベントリを登録できます。
今回はホストインベントリのパラメーターを追加して、ホストインベントリを登録します。

登録済みのホストにホストインベントリを追加する

使用するメソッドは、host.updateです。公式のマニュアルはこちらです。

要求フォーマット

{
    "jsonrpc": "2.0",
    "method": "host.update",
    "params": {
        "hostid": 10387,
        "inventory_mode": 0,
        "inventory": {
            "location": "Latvia, Riga",
        }
    },
    "auth": "********************************",
    "id": 1
}

上記の例では、ホストインベントリの「場所」を登録しています。

また登録済みのホストにホストインベントリを追加する場合は、パラメーターに登録済みホストのIDも指定します。

応答フォーマット

{
    "jsonrpc": "2.0",
    "result": {
        "hostids": [
            "10387"
        ]
    },
    "id": 1
}

ホストインベントリの登録に成功すると、Zabbix APIはホストのIDを応答します。

登録パラメーターの概要

公式のマニュアルはこちらです。

ホストの登録に必要な基本パラメーターはホストの登録と削除で紹介していますので、こちらを参考にしていただけますと幸いです。
今回は追加で必要となるパラメーターを紹介します。

プロパティ宣言型説明
inventory_modeintegerホストインベントリのモード
-1 : 無効(規定値)
0 : マニュアル
1 : 自動

ホストインベントリのモードを設定するパラメーターです。
ホストインベントリを使用するにはモードを「マニュアル」もしくは「自動」に設定する必要があります。

次にホストインベントリに登録できるパラメーターを紹介します。

IDプロパティ宣言型説明
4aliasstringエイリアス
11asset_tagstring資産タグ
28chassisstringシャーシ
23contactstring連絡先
32contract_numberstring契約番号
47date_hw_decommstringハードウェアの使用期限
46date_hw_expirystringハードウェアメンテナンス終了日
45date_hw_installstringハードウェア設置日
44date_hw_purchasestringハードウェア購入日
34deployment_statusstring配布ステータス
14hardwarestringハードウェア
15hardware_fullstringハードウェア (詳細)
39host_netmaskstringホストのサブネットマスク
38host_networksstringホストネットワーク
40host_routerstringホストルータ
30hw_archstringハードウェアアーキテクチャ
33installer_namestringインストーラ名
24locationstring場所
25location_latstring緯度
26location_lonstring経度
12macaddress_astringMACアドレスA
13macaddress_bstringMACアドレスB
29modelstringモデル
3namestring名前
27notesstring備考
41oob_ipstringOOB IPアドレス
42oob_netmaskstringOOBサブネットマスク
43oob_routerstringOOBルータ
5osstringOS
6os_fullstringOS (詳細)
7os_shortstringOS (簡易説明)
61poc_1_cellstringプライマリPOCセル
58poc_1_emailstringプライマリPOCメール
57poc_1_namestringプライマリPOC名
63poc_1_notesstringプライマリPOCノート
59poc_1_phone_astringプライマリPOC電話番号A
60poc_1_phone_bstringプライマリPOC電話番号B
62poc_1_screenstringプライマリPOCスクリーン名
68poc_2_cellstringセカンダリPOCセル
65poc_2_emailstringセカンダリPOCメール
64poc_2_namestringセカンダリPOC名
70poc_2_notesstringセカンダリPOCノート
66poc_2_phone_astringセカンダリPOC電話番号A
67poc_2_phone_bstringセカンダリPOC電話番号B
69poc_2_screenstringセカンダリPOCスクリーン名
8serialno_astringシリアル番号A
9serialno_bstringシリアル番号B
48site_address_astring住所A
49site_address_bstring住所B
50site_address_cstring住所C
51site_citystring
53site_countrystring
56site_notesstringノート
55site_rackstringラック設置場所
52site_statestring
54site_zipstring郵便番号
16softwarestringソフトウェア
18software_app_astringソフトウェアアプリケーションA
19software_app_bstringソフトウェアアプリケーションB
20software_app_cstringソフトウェアアプリケーションC
21software_app_dstringソフトウェアアプリケーションD
22software_app_estringソフトウェアアプリケーションE
17software_fullstringソフトウェア(詳細)
10tagstringタグ
1typestringタイプ
2type_fullstringタイプ(詳細)
35url_astringURL A
36url_bstringURL B
37url_cstringURL C
31vendorstringベンダー

計70個のパラメーターを登録できます。
そしてホストインベントリで登録できるパラメーターの値はすべてstring型です。

またIDパラメーターはホストインベントリの自動登録でアイテムと紐づけする際に使用されるパラメーターになります。今回は手動で設定するので使用しません。

Pythonで実装する

それでは実際にプログラムを実装します。

ホストの登録時にホストインベントリを登録する

ホストの登録プログラムを土台にして説明します。記事はこちらです。

プログラム

ハイライト部分がホストインベントリ登録の実装です。
最初のホスト登録でホストインベントリのモードが設定されていないため、「inventory_mode」を設定します。

また今回は例としてホストインベントリの「名前」を登録しています。

import os
import traceback
from function import login, logout, invoke
  
def main():
    server = "http://hostname/zabbix"
    user = "Admin"
    password = "******"
    session_id = ""
 
    # ホストインターフェースは「Zabbixエージェント」
    interfaces = [
        {
            "type": 1,
            "main": 1,
            "useip": 1,
            "ip": "192.168.3.1",
            "dns": "",
            "port": "10050"
        }
    ]
 
    # ホストグループ「Linux servers」に所属
    hostgroups = [
        {
            "groupid": "2"
        }
    ]

    # ホストインベントリの「名前」に「Linux Server」を登録
    hostinventory = {
        "name": "Linux Server"
    }
 
    try:
        session_id = login(server, user, password)
        if 0 < len(session_id):
            request = {
                "jsonrpc": "2.0",
                "method": "host.create",
                "params": {
                    "host": "Linux Server",
                    "interfaces": interfaces,
                    "groups": hostgroups,
                    # 初回の登録のためホストインベントリモードを「手動」に設定
                    "inventory_mode": 0,
                    "inventory": hostinventory
                },
                "auth": session_id,
                "id": 1
            }
 
            response = {}
            if invoke(server, request, response):
                print("hostid(s): {}".format(response["result"]["hostids"]))
 
            else:
                print("{}: error: message={}, data={}, code={}".format(
                    os.path.basename(__file__),
                    response["error"]["message"],
                    response["error"]["data"],
                    response["error"]["code"])
                )
             
    except Exception as e:
        print("{}: exception: {}".format(
            os.path.basename(__file__),
            traceback.format_exc())
        )
 
    finally:
        if 0 < len(session_id):
            # ログインしたら、忘れずにログアウトしましょう
            logout(server, session_id)
 
if __name__ == "__main__":
    main()

実行結果

PS C:\zabbixapi\sample> python3 .\sample-06.py
hostid(s): ['10381']
ホストインベントリの「名前」

ホストインベントリの「名前」に「Linux Server」が入りました!

登録済みのホストにホストインベントリを追加する

実装の土台には、以前の記事で紹介した「ログイン~ログアウト、一連の流れ」を使います。記事はこちらです。

プログラム

次は先ほど登録したホストに対してホストインベントリを追加登録します。
今回は既にホストインベントリのモードが設定されているため、「inventory_mode」は設定しません。

import os
import traceback
from function import login, logout, invoke
 
def main():
    server = "http://hostname/zabbix"
    user = "Admin"
    password = "******"
    session_id = ""
 
    try:
        session_id = login(server, user, password)
        if 0 < len(session_id):
            request = {
               "jsonrpc": "2.0",
               "method": "host.update",
               "params": {
                   "hostid": 10381,
                   # 「inventory_mode」は設定済みのため不要
                   # 「OS」と「OS(詳細)」を追加で登録
                   "inventory": {
                       "os": "Linux",
                       "os_full": "CentOS Linux release 8.3"
                   }
                },
                "auth": session_id,
                "id": 1
            }
 
            response = {}
            if invoke(server, request, response):
                print("hostid(s): {}".format(response["result"]["hostids"]))
 
            else:
                print("{}: error: message={}, data={}, code={}".format(
                    os.path.basename(__file__),
                    response["error"]["message"],
                    response["error"]["data"],
                    response["error"]["code"])
                )
 
    except Exception as e:
        print("{}: exception: {}".format(
            os.path.basename(__file__),
            traceback.format_exc())
        )
 
    finally:
        if 0 < len(session_id):
            # ログインしたら、忘れずにログアウトしましょう
            logout(server, session_id)
 
if __name__ == "__main__":
    main()

実行結果

PS C:\zabbixapi\sample> python3 .\sample-07.py
hostid(s): ['10381']
ホストインベントリの「OS」と「OS(詳細)」

先ほど登録したホストに「OS」と「OS(詳細)」のホストインベントリが追加されました!

まとめ

この記事では、Zabbix APIを呼び出してホストインベントリを登録する方法について紹介しました。

ホストインベントリはホストの数が多い場合、1つひとつを手動で設定していては大変です。そこでプログラムで実装し自動化することでホストインベントリの登録が簡単にできるようになります。
ぜひ試してみてください!

次回は「ホストインベントリの削除方法」について紹介したいと思います。

  • 株式会社アークシステムの予約・来訪管理システム BRoomHubs
  • 低コスト・短納期で提供するまるごとおまかせZabbix