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の辞書として渡し、キーワード引数のアンパック構文を使うこともできます。

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アクションを記述

api.logout()

APIトークンを使用している場合は、logout()メソッドの呼び出しは不要です。

APIリクエスト

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

APIメソッドは、以下のフォーマットで呼び出します。

api_instance.zabbix_object.method(parameters)

一部のZabbix APIメソッドやオブジェクト名には、Pythonの予約語(例:import)が使われています。 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モジュールをインポートします(事前に必要な依存関係をインストールする必要があります)。
  • 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ディレクトリにあります。