【5.0対応済】Python3でZabbix API – ホストインターフェースの登録

Python,Zabbix,Zabbix API

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

前回の記事ではホストをZabbixに登録する方法、そして削除する方法について説明しました。今回はホストの登録時に一緒に設定するホストインターフェースについて、詳しく解説します。

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

ホストインターフェースの情報を登録する

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

ホストの登録時にホストインターフェースを登録する

使用するメソッドは、host.createです。ホストを登録する方法で説明したプログラムの11~28行目に記載した方法です。以下はその部分を抜粋したものです。

    # ホストインターフェースは「Zabbixエージェント」
    interfaces = [
        {
            "type": 1,
            "main": 1,
            "useip": 1,
            "ip": "192.168.3.1",
            "dns": "",
            "port": "10050"
        }
    ]

登録済みのホストにホストインターフェースを追加する

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

要求フォーマット

{
    "jsonrpc": "2.0",
    "method": "hostinterface.create",
    "params": {
        "hostid": "30052",
        "dns": "",
        "ip": "192.168.3.1",
        "main": 0,
        "port": "10050",
        "type": 1,
        "useip": 1
    },
    "auth": "********************************",
    "id": 1
}

上記の例では、ホストインターフェースとしてZabbixエージェントを登録しています。

登録済みのホストにホストインターフェースを追加する場合は、パラメーターに登録済みホストのIDも指定します。(その他のパラメーターについては、以前の記事を読んでいただけている方であれば説明は不要と考えます。)

応答フォーマット

{
    "jsonrpc": "2.0",
    "result": {
        "interfaceids": [
            "30062"
        ]
    },
    "id": 1
}

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

登録パラメーターの概要

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

英語だとわかりにくいので、今回も日本語化してみました。

プロパティ宣言型説明
interfaceidstringホストインターフェースのID(読取専用)
dnsstringホストインターフェースで使用するDNS名(接続先情報)
useipプロパティでDNS名による接続を指定した場合は必須
hostidstringホストインターフェースを追加するホストのID
hostinterface.createメソッドを使う場合は必須
ipstringホストインターフェースで使用するIPアドレス(接続先情報)
useipプロパティでIPアドレスによる接続を選択した場合は必須
main(必須)integerこのホストインターフェースをホストのデフォルトとして用いるか否か
ホスト内に同じ種類のホストインターフェースを複数追加する場合は、
1つだけデフォルトとして設定する
・0: デフォルトではない
・1: デフォルト
port(必須)stringホストインターフェースが使用するポート番号
ユーザーマクロを含めることができる
type(必須)integerホストインターフェースの種類
1: Zabbixエージェント
2: SNMP
3: IPMI
4: JMX
useip(必須)integerホストインターフェースの接続方法(接続先情報)
0: DNS名による接続
1: IPアドレスによる接続
detailsarray接続に用いる詳細な情報
typeプロパティでSNMPを選択した場合は必須

detailsプロパティに記載がありますが、ホストインターフェースにSNMPを用いる場合は、さらに設定が必要です。また、使用するSNMPのバージョンによって接続パラメーターが変化します。

プロパティ宣言型SNMPv1
SNMPv2c
SNMPv3説明
versionintegerSNMPインターフェースのバージョン
1: SNMPv1
2: SNMPv2c(規定値)
3: SNMPv3
bulkintegerbulkリクエストを使用するか否か
0: bulkリクエストを使用しない
1: bulkリクエストを使用する
communitystringSNMPコミュニティ名
securitynamestringSNMPv3のセキュリティ名
securitylevelintegerSNMPv3のセキュリティレベル
0: noAuthNoPriv(規定値)
1: authNoPriv
2: authPriv
authpassphrasestringSNMPv3の認証パスフレーズ
privpassphrasestringSNMPv3のプライバシーパスフレーズ
authprotocolintegerSNMPv3の認証プロトコル
0: MD5(規定値)
1: SHA
privprotocolintegerSNMPv3のプライバシープロトコル
0: DES(規定値)
1: AES
contextnamestringSNMPv3のコンテキスト名

Pythonで実装する

では、実際にホストインターフェースを登録してみましょう。

ホストの登録時にホストインターフェースを登録する

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

プログラムの11~28行目を修正します。Zabbixエージェント、IPMIならびにJMX、3つのホストインターフェースを同時に登録してみましょう。

    # 上から「Zabbixエージェント」「IPMI」「JMX」
    interfaces = [
        {
            "type": 1,
            "main": 1,
            "useip": 1,
            "ip": "192.168.3.1",
            "dns": "",
            "port": "10050"
        },
        {
            "type": 3,
            "main": 1,
            "useip": 1,
            "ip": "192.168.3.1",
            "dns": "",
            "port": "623"
        },
        {
            "type": 4,
            "main": 1,
            "useip": 1,
            "ip": "192.168.3.1",
            "dns": "",
            "port": "10052"
        }
    ]

SNMPv1、SNMPv2c の場合

SNMPのホストインターフェースを登録する場合は、detailsプロパティも設定します。

    # ホストインターフェースは「SNMPv2c」
    interfaces = [
        {
            "type": 2,
            "main": 1,
            "useip": 1,
            "ip": "192.168.3.1",
            "dns": "",
            "port": "161",
            "details": {
                "version": 2,
                "bulk": 1,
                "community": "************"
            }
        }
    ]

SNMPv3の場合

SNMPv1、SNMPv2cと同じくdetailsプロパティを設定しますが、その内側に設定するプロパティが異なります。

    # ホストインターフェースは「SNMPv3」
    interfaces = [
        {
            "type": 2,
            "main": 1,
            "useip": 1,
            "ip": "192.168.3.1",
            "dns": "",
            "port": "161",
            "details": {
                "version": 3,
                "bulk": 1,
                "securityname": "********************************",
                "securitylevel": 2,
                "authpassphrase": "********************************",
                "privpassphrase": "********************************",
                "authprotocol": 1,
                "privprotocol": 1,
                "contextname": "********************************",
            }
        }
    ]

登録済みのホストにホストインターフェースを追加する

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

以下のプログラムの中で、ハイライトしている部分がホストインターフェース固有の実装です。今回はホストインターフェースとして、JMXを登録しています。hostidプロパティは、あらかじめ調べておいてくださいね!

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": "hostinterface.create",
                "params": {
                    "hostid": "10425",
                    "dns": "",
                    "ip": "192.168.3.1",
                    "main": 1,
                    "port": "10052",
                    "type": 4,
                    "useip": 1
                },
                "auth": session_id,
                "id": 1
            }

            response = {}
            if invoke(server, request, response):
                print("interfaceid(s): {}".format(response["result"]["interfaceids"]))

            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-05.py
interfaceid(s): ['116']

ホストインターフェースが追加されたと思います。JMX以外のホストインターフェースでも、paramsプロパティの内容を変更すれば、ホストインターフェースを追加できます。ホストの登録時にホストインターフェースを登録した方法と同じパラメーターを設定してみてください。

登録済みのホストにホストインターフェースを追加する場合は、パラメーターに登録済みホストのIDも指定します。(再掲)

Zabbix4.0→5.0の変更点

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

SNMPバージョンとクレデンシャル情報の設定方法

バージョン5.0からSNMPバージョンならびにクレデンシャル情報の設定を、ホストインターフェース設定で実施するようになりました。ホストインターフェース情報をZabbix APIで登録していた方は、プログラムの改修が必須となっています。内容をご確認の上で、改修作業をお願いします。

なお、Zabbixエージェント、IPMIならびにJMXを用いている方は影響がありません。

SNMPエージェント関連の変更につきましては、Zabbix公式のドキュメントを確認いただくことを強くお勧めいたします。

まとめ

この記事では、ホストに対するホストインターフェース情報の登録を、Zabbix APIを使って実装する方法について紹介しました。

ホストの登録には必ずホストインターフェース情報を必要とします。そして、バージョン5.0ではシステム監視をする上でほぼ必須となるSNMP関連の設定方法に大幅な変更が入りました。Zabbix APIを用いていない方も一度、今回の変更点を確認していただけますと幸いです。

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

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

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