【7.0対応済】Python3でZabbix API – ホストインベントリの削除

Python,Zabbix,Zabbix API

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

以前の記事でZabbix APIを使用して、ホストのインベントリを登録する方法について説明しました。
今回はその続きとして、ホストのインベントリを削除する方法について説明します。

ホストのインベントリ機能を使用することで、さまざまな情報を登録し活用できます。
しかし、時には不要になった情報を削除する必要があります。
そこで、Zabbix APIを利用してホストのインベントリを効率的に削除する方法を紹介します。

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

ホストのインベントリを削除する

ホストのインベントリに登録された情報を削除するには、2種類の方法があります。
1つ目はホストに登録しているインベントリ情報を1つずつ削除する方法、2つ目はホストのインベントリ機能を無効にすることで登録している情報を全て削除する方法です。

それぞれについて、順番に説明していきます。

ホストのインベントリ情報を1つずつ削除する

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

要求フォーマット

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

ホストのインベントリ情報を登録する方法でも使用した、host.updateでインベントリの情報を上書きする方法です。
上記はインベントリの「location」に値が入っている場合を想定しています。
インベントリモードを「0 (手動)」にし「"location"」の値に「""」を入れ、値を上書くことで削除しています。

応答フォーマット

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

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

ホストのインベントリ機能を無効にし、インベントリ情報をすべて削除する

ホストのインベントリ情報を1つずつ削除する時と同様に使用するメソッドは、host.updateです。

要求フォーマット

{
    "jsonrpc": "2.0",
    "method": "host.update",
    "params": {
        "hostid": 10607,
        "inventory_mode": -1,
    },
    "auth": "********************************",
    "id": 1
}

ホストのインベントリモードを「-1 (無効)」に設定することでインベントリ機能を無効にし、インベントリの情報をすべて削除しています。
この方法を使用すると、インベントリの情報に登録しているすべての値が削除されてしまい、再度機能を有効にしても値は元に戻らないため、注意が必要です。

応答フォーマット

ホストのインベントリ情報を1つずつ削除する時と同様の応答が返ってくるため、割愛します。

Pythonで実装する

実際にプログラムを実装していきます。
今回は前提として、ホストのインベントリ「Name」と「OS」に値を入れたホストを用意しています。

 初期状態
初期状態

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

ホストのインベントリ情報を1つずつ削除する

それでは実際にホストのインベントリ「Name」の値を削除してみます。

プログラム

ハイライト部分が今回の実装です。

import os
import traceback
from function import login, logout, invoke
  
def main():
    server = "http://hostname/zabbix"
    user = "Admin"
    password = "******"
    session_id = ""
 
    # ホストインベントリの「名前」に「""(空白)」を登録
    hostinventory = {
        "name": ""
    }
 
    try:
        session_id = login(server, user, password)
        if 0 < len(session_id):
            request = {
                "jsonrpc": "2.0",
                "method": "host.update",
                "params": {
                    "hostid": 10607,     ## 変更するホストのIDを指定
                    "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-07.py
hostid(s): ['10607']
 Nameの値が削除される
Nameの値が削除される

「Name」の値を削除できました!

ホストのインベントリ機能を無効にし、 インベントリ情報をすべて削除する

続いてホストのインベントリ情報を初期状態に戻し、インベントリモードを無効にすることで「Name」と「OS」の値を削除していきます。

プログラム

ハイライト部分が今回の実装です。

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": 10607,      ## 変更するホストのIDを指定
                    "inventory_mode": -1, ## インベントリを無効化
                },
                "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): ['10607']
 NameとOSの値が削除される
NameとOSの値が削除される

ホストのインベントリモードが無効となり「Name」と「OS」の値が削除されました。
また試しにモードを「Manual(手動)」にしてみると、

 再度、有効にしても値は戻らない
再度、有効にしても値は戻らない

画像の通り、値は元に戻りませんでした。
一斉削除は便利ですが、元に戻せなくなるので注意が必要です。

まとめ

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

ホストのインベントリ情報を登録したはいいものの多すぎて煩雑になった際には、プログラムで実装し自動化をすることでインベントリ情報の削除が簡単にできます。
ぜひ試してみてください。

アークシステムは Zabbix Japan LLC の認定パートナー企業です。 当社はZabbixバージョン1.1の時代から監視ソリューションの活用を進め、Zabbixに関する製品・サービスの販売に加え、Zabbix関連サービスの提供を行っています。

Zabbixに関するお問い合わせはこちらからお願いいたします。
  • 株式会社アークシステムの予約・来訪管理システム BRoomHubs
  • 低コスト・短納期で提供するまるごとおまかせZabbix