【5.0対応済】Python3でZabbix API – ホストの登録と削除

2020年10月20日Python,Zabbix,Zabbix API

こんにちは。プラットフォーム技術部の飯出(いいで)です。

前回の記事ではZabbixに登録したホストの情報をZabbix APIを使って取得する実装の仕方について説明しました。今回はホストをZabbixに登録する方法、そして削除する方法について解説します。

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

ホストの情報を登録する

使用するメソッドは、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
}

ホスト情報の登録では、登録の本体となるホストに関する情報に加え、ホストグループ、ホストインターフェース、タグ、テンプレート、マクロならびにホストインベントリの登録ができます。この記事では、慣れていただくことを前提に、登録時の必須パラメーターとなるホストグループとホストインターフェースを使って解説します。

応答フォーマット

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

ホスト情報の登録に成功すると、Zabbix APIはホストのIDを応答します。

登録パラメーターの概要

日本語化してみました。

プロパティ宣言型説明
host(必須)stringホストの名前
groups(必須)object/arrayホストを追加するホストグループのID
1つ以上のホストグループを指定する必要あり
interfaces(必須)object/arrayホスト用に作成するインターフェースの情報
1つ以上のホストインターフェースを登録する必要あり
・Zabbixエージェント
・SNMP
・IPMI
・JMX
tagsobject/arrayホストに付与するタグの名前とその値
templatesobject/arrayホストにリンクするテンプレートのID
macrosobject/arrayホスト用に作成するユーザーマクロとその値
inventoryobjectホストインベントリの情報

ホストの登録に最低限必要な情報は、上記の表で必須と記載した値です。上記に加え、ホストの付与情報も一緒に登録できます。ホストに付与できる情報については、以下の記事で日本語訳を紹介していますので、確認してください。

Pythonで実装する

では、実際にホストの情報をZabbixに登録してみましょう。

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

プログラム

以下のプログラムの中で、ハイライトしている部分がホスト固有の実装です。ホストインターフェースの部分は、Zabbixエージェントを登録しています。SNMP、IPMIならびにJMXのホストインターフェースを登録する方法については、後日紹介したいと思います。

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"
        }
    ]

    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
                },
                "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-04.py
hostid(s): ['10378']
ホスト情報の登録結果

ホスト情報がちゃんと登録されました!

このプログラムを呼び出し元から要求パラメーターを渡せるように改造し、関数化すれば登録対象となるホストが100台あろうと200台あろうと、鬼に金棒ですね!

ホストを削除する

ホストを削除するには、host.deleteメソッドを使います。せっかく登録したホストですが、ここで削除しちゃいます(笑)

要求パラメーター

{
    "jsonrpc": "2.0",
    "method": "host.delete",
    "params": [
        "13",
        "32"
    ],
    "auth": "********************************",
    "id": 1
}

応答パラメーター

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

Pythonで実装する

実装を紹介します。

ハイライトしている部分が、実装の変更点です。複数台のホスト情報を削除したい場合は、変数 hosts の配列に当該ホストのIDを追加することによって実現できます。

プログラム

import os
import traceback
from function import login, logout, invoke
 
def main():
    server = "http://hostname/zabbix"
    user = "Admin"
    password = "******"
    session_id = ""

    hosts = [
        "10378"
    ]

    try:
        session_id = login(server, user, password)
        if 0 < len(session_id):
            request = {
                "jsonrpc": "2.0",
                "method": "host.delete",
                "params": hosts,
                "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()

ホストが削除できました。簡単でしたね。
今回の実装は、ここまで。

Zabbix4.0→5.0の変更点

バージョン5.0でホスト情報を登録する際における変更点の中で、特にZabbix API呼び出しに影響がある点について、紹介します。バージョン4.2ならびに4.4で追加となった機能もありますが、当社ではLTS版単位でバージョンアップ情報を扱っています。

ホスト情報にタグが追加

ホスト情報の取得やホスト登録時における要求フォーマットの紹介で軽く触れましたが、Zabbix APIを使ってホストにタグを付与できます。ホストの登録時において、以下のような実装を追加することによって、ホストに対するタグの追加を実現できます。

tags = [
    {
        "tag:": "tag name",
        "value": "tag value"
    }
]

request = {
    "jsonrpc": "2.0",
    "method": "host.create",
    "params": {
        "host": "Linux Server",
        "interfaces": interfaces,
        "groups": hostgroups,
        "tags": tags
    },
    "auth": session_id,
    "id": 1
}

タグの使いどころ

例えば、ホストグループ「Linux servers」に複数のLinuxサーバーが存在し、そのうち数台のサーバーでMySQLが稼働しているとします。ユーザー「データベース管理者」がホストの一覧を参照する場合、MySQLがインストールされていないサーバーの情報はノイズとなり得ます。

この場合において、MySQLが稼働しているホスト(サーバー)の設定にタグ「Service: MySQL」を設定することによって、ホストの一覧表示時にタグ「Service: MySQL」をフィルターパラメーターとして指定し、絞り込むことができます。

バージョン5.0からは、テンプレートおよびホストレベルでタグが定義できるようになったため、タグを透過的に使えるようになっています。それらを1カ所で定義して、フィルター・アクション・イベント相関関係・メンテナンスなどで利用できます。(実際は、テンプレートに設定する方法が効率的かと思われます。)

ユースケースについてはZabbix Blogでも紹介されていますので、興味のある方はぜひご覧ください。

ホストインターフェース情報の登録に注意

バージョン5.0からSNMPのホストインターフェース情報に変更が入っています。ホストインターフェースとしてZabbixエージェント、IPMIならびにJMXを用いている方は影響ありませんが、SNMPを用いている方は実装の変更が必要です。

こちらでホストインターフェース別の登録方法について紹介していますので、ご覧ください。

まとめ

この記事では、Zabbix APIを呼び出して監視対象となるホストを登録する実装について紹介しました。

社内で新しいシステムを既存のZabbixで監視したい。となった場合など、数台のホスト追加であればフロントエンドから手作業で登録すれば良いと思いますが、追加対象が10台を超えてくると手作業による登録ミスなどが起こりやすくなります。このような場合において、ホストの登録作業を自動化することで効率よく対応できるのではないでしょうか。

次回は「ホストインターフェースの登録方法」を種別毎に紹介したいと思います。

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

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