Zabbixエージェントからデータを収集する

概要

zabbix_utils を使用すると、Zabbixエージェントからデータを収集できます(Zabbix get と同様)。

データは同期モードまたは非同期モードで収集できます。

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

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

インポート

アイテムの値を収集するために zabbix_utils を使用するには、Python スクリプトで Getter クラスをインポートします。

from zabbix_utils import Getter

リクエストデータ

アイテムの値を取得するには、次の手順を実行します。

  1. Getter インスタンスを作成し、Zabbix エージェントの IP アドレスとポートを指定します。
  2. Getter インスタンスの get() メソッドを呼び出し、取得したいアイテムのキーを指定します。

たとえば、system.uname アイテムのデータを取得するには、次のようにします。

agent = Getter(host='192.0.2.1', port=10050)
response = agent.get('system.uname')
デフォルト以外のIPの使用

スクリプトを実行しているサーバーに複数のIPアドレスがある場合、Zabbix エージェントへの接続時に Getter が使用する source_ip を指定できます。

agent = Getter(
    host='192.0.2.1',
    port=10050,
    source_ip='10.10.7.1'
)
タイムアウトの使用

Getter に応答 timeout を設定して、スクリプトが Zabbix エージェントからの応答をどれだけ待ってから諦めるかを制御できます。

agent = Getter(
    host='192.0.2.1',
    port=10050,
    timeout=30
)
暗号化の使用

Getter には組み込みの暗号化サポートは含まれていませんが、サードパーティーライブラリを使用してラッパーを作成することで提供できます。

def psk_wrapper(sock, tls):
    # ...
    # ソケット用の TLS PSK ラッパーの実装
    # ...

agent = Getter(
    host='192.0.2.1',
    port=10050,
    socket_wrapper=psk_wrapper
)
レスポンス

Zabbixエージェントからのレスポンスはライブラリによって処理され、AgentResponse オブジェクトとして返されます。

print(response)
# {
#     "error": null,
#     "raw": "Linux zabbix_server 5.15.0-3.60.5.1.el9uek.x86_64",
#     "value": "Linux zabbix_server 5.15.0-3.60.5.1.el9uek.x86_64"
# }

print(response.value)
# Linux zabbix_server 5.15.0-3.60.5.1.el9uek.x86_64

print(response.error)
# None
非同期モード

非同期モードを使用すると、各値の到着を待たずにスクリプトで値を収集できます。
これにより、多数の値を収集する必要がある場合や、一部の値の収集に時間がかかる場合に、スクリプトをより効率的にできます。

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

  • Python の asyncio モジュールをインポートします(まず必要な依存関係をインストールする必要があります)。
  • Getter の代わりに AsyncGetter をインポートします。
  • コードは async 関数内に記述します。
  • get() メソッドを呼び出すときは await を使用します。

たとえば、非同期モードを使用して 1 つの値を収集するには、次のようにします。

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

# 2. すべてのデータ要求を実行するメインの async 関数を定義します:
async def main():
    agent = AsyncGetter(host='192.0.2.1', port=10050)

    # 3. Zabbix エージェントから system.uname の値を取得します(await が必要):
    response = await agent.get('system.uname')

    # 4. Zabbix エージェントが返した値を表示します:
    print(response.value)

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