Zabbixエージェントからデータを収集する
概要
zabbix_utils を使用すると、Zabbix エージェントからデータを収集できます(Zabbix get と同様)。
データは同期モードまたは非同期モードで収集できます。
- 同期モードでは、Pythonスクリプトはデータを要求し、受信するまで待機してから処理を続行します。これは、単純で順次的かつ予測可能な操作に適しています。
- 非同期モードでは、スクリプトは各応答を待たずにデータを要求するため、他の処理を並行して進めることができます。これは、応答の遅い要求や大量のデータを扱う場合に、より効率的です。
このページの例は同期モードに重点を置いていますが、非同期モード も同様のパターンに従います。 追加の例は、GitHub リポジトリの zabbix_utils で利用できます。
インポート
アイテムの値を収集するために zabbix_utils を使用するには、Pythonスクリプトで Getter クラスをインポートします。
from zabbix_utils import Getter
リクエストデータ
アイテムの値をリクエストするには:
- ZabbixエージェントのIPアドレスとポートを指定して、
Getterインスタンスを作成します。 Getterインスタンスでget()メソッドを呼び出し、取得したいアイテムのキーを指定します。
例えば、system.unameアイテムのデータをリクエストするには:
agent = Getter(host='192.0.2.0', port=10050)
response = agent.get('system.uname')
デフォルト以外のIPを使用する
スクリプトを実行しているサーバーが複数のIPアドレスを持つ場合、Zabbixエージェントへの接続時に Getter が使用する source_ip を指定できます。
agent = Getter(
host='192.0.2.0',
port=10050,
source_ip='10.10.7.1'
)
timeoutの使用
Getter に応答 timeout を設定して、スクリプトがZabbixエージェントからの応答を待機する時間を制御できます。指定した時間を過ぎると待機を中止します。
agent = Getter(
host='192.0.2.0',
port=10050,
timeout=30
)
暗号化の使用
Getter には組み込みの暗号化サポートは含まれていませんが、サードパーティライブラリを使用してラッパーを作成することで対応できます。
def psk_wrapper(sock, tls):
# ...
# ソケット用のTLS PSKラッパーの実装
# ...
agent = Getter(
host='192.0.2.0',
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モジュールをインポートします(最初に必要な依存関係をinstallする必要があります)。 Getterの代わりにAsyncGetterをインポートします。- コードを
async関数内に記述します。 get()メソッドを呼び出す際にawaitを使用します。
例えば、非同期モードを使用して単一の値を収集するには、次のようにします。
# 1. 非同期モード用にasyncioと、zabbix_utilsからAsyncGetterをインポートします:
import asyncio
from zabbix_utils import AsyncGetter
# 2. すべてのデータ要求を実行するメインのasync関数を定義します:
async def main():
agent = AsyncGetter(host='192.0.2.0', 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())