Zabbix APIを使用する

zabbix_utils を使用すると、Zabbix API を利用して、ホストの作成、アイテムの更新、イベントの取得など、Zabbixオブジェクトを管理できます。

APIリクエストは、同期モードまたは非同期モードで実行できます。

  • 同期モードでは、Pythonスクリプトはリクエストを送信し、応答を受信してから処理を続行します。これは、単純で順次的かつ予測可能な操作に適しています。
  • 非同期モードでは、スクリプトは各応答を待たずにリクエストを送信するため、他の処理を並行して進めることができます。これは、応答に時間がかかるリクエストや大量のデータをまとめて処理する場合に、より効率的です。

このページの例では同期モードに重点を置いていますが、非同期モード でも同様のパターンに従います。 追加の例は、GitHubリポジトリの zabbix_utils で利用できます。

インポート

Zabbix API を操作するために zabbix_utils を使用するには、スクリプトで ZabbixAPI クラスをインポートします。

from zabbix_utils import ZabbixAPI

すでにコミュニティの Python ライブラリを使用している場合は、通常、そのインポートを zabbix_utils の ZabbixAPI に置き換えることができます。

ログイン

APIリクエストを行う前に、ZabbixAPIインスタンスを作成し、Zabbix APIにログインする必要があります。

認証情報の管理方法に最も適した方法を選択してください。
ユーザー名とパスワード、またはAPIトークンを使用できます。

初期化時

ZabbixAPI インスタンスを作成する際に、Zabbix WebインターフェースのURLと認証情報をまとめて指定できます。

# ユーザー名とパスワード:
api = ZabbixAPI(url="127.0.0.1/zabbix", user="Admin", password="zabbix")

# APIトークン:
api = ZabbixAPI(url="127.0.0.1/zabbix", token="your_api_token")

接続パラメータをまとめて扱いたい場合は、Pythonの辞書として渡し、Pythonのキーワード引数構文を使用して展開できます。

ZABBIX_AUTH = {
    "url": "127.0.0.1/zabbix",
    "user": "Admin",
    "password": "zabbix"
}

api = ZabbixAPI(**ZABBIX_AUTH)
login() の使用

まず、Zabbix WebインターフェースのURLだけを指定して ZabbixAPI インスタンスを作成し、その後で認証情報を指定して login() メソッドを使用できます。

# ユーザー名とパスワード:
api = ZabbixAPI(url="127.0.0.1/zabbix")
api.login(user="Admin", password="zabbix")

# APIトークン:
api = ZabbixAPI(url="127.0.0.1/zabbix")
api.login(token="your_api_token")
環境変数の使用

まず、認証情報を環境変数として保存できます。たとえば、ターミナルで次のように設定します。

# ユーザー名とパスワード:
export ZABBIX_USER="Admin"
export ZABBIX_PASSWORD="zabbix"

# トークン:
export ZABBIX_TOKEN="your_api_token"

その後、同じターミナルセッションからスクリプトを開始する場合、スクリプト内の ZabbixAPI インスタンスに必要なのは Zabbix WebインターフェースのURL だけです。

api = ZabbixAPI(url="127.0.0.1/zabbix")

URL も環境変数に保存できます。

# ユーザー名とパスワード:
export ZABBIX_USER="Admin"
export ZABBIX_PASSWORD="zabbix"
export ZABBIX_URL="https://127.0.0.1/zabbix"

# トークン:
export ZABBIX_TOKEN="your_api_token"
export ZABBIX_URL="https://127.0.0.1/zabbix"

URL と認証情報がすべて環境変数として設定されている場合、スクリプト内の ZabbixAPI インスタンスには引数はまったく不要です。

api = ZabbixAPI()

ログアウト

ユーザー名とパスワードを使用してログインした場合は、API操作の完了後に logout() メソッドを呼び出します。

from zabbix_utils import ZabbixAPI

api = ZabbixAPI(url="127.0.0.1/zabbix")
api.login(user="Admin", password="zabbix")

# API actions go here

api.logout()

APIトークンを使用する場合、logout() メソッドを呼び出す必要はありません。

APIリクエスト

ログイン後、Zabbix APIのメソッドリファレンスで説明されているメソッドを呼び出すことで、任意のAPIリクエストを実行できます。

APIメソッドは、次の形式で呼び出します。

api_instance.zabbix_object.method(parameters)

一部のZabbix APIメソッド名またはオブジェクト名では、Pythonの予約語である単語(例: import)が使用されています。
Pythonのエラーを回避するには、Pythonで使用する際にメソッド名またはオブジェクト名の末尾にアンダースコアを追加してください(例: api.configuration.import_)。

たとえば、host.get を使用してホストの一覧を表示するには、次のようにします。

# 1. zabbix_utilsからZabbixAPIをインポート:
from zabbix_utils import ZabbixAPI

# 2. ZabbixAPIインスタンスを作成してログイン:
api = ZabbixAPI(url="127.0.0.1/zabbix")
api.login(user="Admin", password="zabbix")

# 3. フィルターに一致するホストを取得:
hosts = api.host.get(
    filter={
        "host": [
            "Zabbix server",
            "Linux server"
        ]
    }
)

# 4. 返されたホストを反復処理し、各ホストの詳細を表示:
for host in hosts:
    print(host)

# 5. セッションを閉じるためAPIからログアウト:
api.logout()
非同期モード

非同期モードでは、スクリプトは各APIリクエストの完了を待たずにAPIリクエストを送信できます。
これにより、多数のAPIリクエストを実行する必要がある場合や、一部のリクエストに長い時間がかかる場合に、スクリプトの効率を高めることができます。

非同期モードを使用する場合、同期モードと比べて重要な違いがあります。

  • Pythonのasyncioモジュールをインポートします(最初に必要な依存関係をinstallする必要があります)。
  • ZabbixAPIの代わりにAsyncZabbixAPIをインポートします。
  • コードをasync関数内に記述します。
  • login()およびlogout()を含むAPIメソッドの呼び出し時にはawaitを使用します。

AsyncZabbixAPIインスタンスを作成する際、初期化中にログインすることはできません。

たとえば、非同期モードでhost.getを使用してホストの一覧を表示するには、次のようにします。

# 1. 非同期モード用にasyncioと、zabbix_utilsからAsyncZabbixAPIをインポートします:
import asyncio
from zabbix_utils import AsyncZabbixAPI

# 2. すべてのAPI操作を実行するメインのasync関数を定義します:
async def main():

    # 3. AsyncZabbixAPIインスタンスを作成してログインします(awaitが必要です):
    api = AsyncZabbixAPI(url="127.0.0.1")
    await api.login(user="User", password="zabbix")

    # 4. フィルターに一致するホストを取得します(awaitが必要です):
    hosts = await api.host.get(
        filter={
            "host": [
                "Zabbix server",
                "Linux server"
            ]
        }
    )

    # 5. 返されたホストを反復処理し、各ホストの詳細を表示します:
    for host in hosts:
        print(host)

    # 6. セッションを閉じるためにAPIからログアウトします(awaitが必要です):
    await api.logout()

# 7. asyncioのイベントループを使用してasync main()関数を実行します:
asyncio.run(main())

以下の例では、zabbix_utilsライブラリを使用した一般的なZabbix APIタスクを示します。

追加の例は、zabbix_utils GitHubリポジトリの examples ディレクトリで利用できます。