OSSサポートの現場から!Zabbixでサーバの構成情報を取得する

Illustration of Zabbix monitoring architecture with a central monitor labeled Zabbix API connected to WebServer, AppServer, DBServer, and components like CPU, memory, and hostname labels.

こんにちは、OSSよろず相談室のSKです。
OSS に関するお問い合わせが日々寄せられる中で、今回も統合監視ツール「Zabbix」に関連して寄せられたお問い合わせをご紹介します。

これまで有償の管理製品を使って、各サーバーの「ホスト名」「メモリ」「CPU」「OS」などの構成情報を管理していたお客様から、次のようなご相談をいただきました。

「利用中の製品がサポート終了を迎えるため、代替手段として、すでに監視で導入しているZabbixのAPIを使って構成情報を取得できないか?」

結論から申し上げますと、Zabbix APIを利用すれば構成情報の一括取得が可能です。すでに監視ツールとしてZabbixを運用している場合、この収集プロセスを自動化・連携させることができます。

今回は、Zabbix APIの host.get メソッドを利用して、外部からサーバーの構成情報(インベントリ情報)を一括取得する具体的な手順とコマンド例を解説します。

Zabbix APIの基本仕様

Zabbix APIはHTTPベースで提供されており、クライアントとAPI間のリクエスト・レスポンスには JSON-RPC 2.0プロトコル を使用します。

APIを呼び出すためのエンドポイント(URL)は、Zabbix Webインターフェースのディレクトリにある api_jsonrpc.php です。デフォルトでは以下のパスにあります。

/usr/share/zabbix/ui/api_jsonrpc.php

ステップ1:APIの認証とトークンの取得

Zabbixのデータにアクセスするには、まず認証を行ってAPIトークン(セッションID)を取得する必要があります。まだ認証されていない状態からのログインには、user.login メソッドを使用します。

以下の curl コマンドを使用して、Zabbixサーバーに認証リクエストを送信します。
※ここでは、デフォルトの管理ユーザーである “Admin” のトークンを取得する例を紹介します。

【コマンド例】

curl -X POST -H "Content-Type: application/json" -d '
{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "username": "Admin",
        "password": "zabbix"
        },
         "id": 1
}' http://172.31.34.176/zabbix/api_jsonrpc.php


認証情報が正しければ、APIから以下のようなJSONレスポンスが返されます。
【取得結果例】

{
    "jsonrpc": "2.0",
    "result": "82aa1b5b38a9fe6f6619ad40c64602dd",
    "id": 1
}


ここで result として返された値(82aa1b5b38a9fe6f6619ad40c64602dd)が認証トークンです。
以後のAPIリクエストでは、このトークンを使用します。

ステップ2:構成情報(インベントリ情報)の取得

認証トークンが取得できたら、次に監視対象ホストの構成情報を取得します。ホスト情報の取得には host.get メソッドを使用します。

ホスト名やIPアドレスだけでなく、CPU、メモリ、OSなどの構成情報(インベントリデータ)を同時に取得するため、パラメータに selectInventory を指定します。また、すべてのデータを取得するとパフォーマンスに影響を与える可能性があるため、output パラメータを使って取得したいプロパティを明示的に絞り込むことが推奨されています。

先ほど取得したトークンは、HTTPリクエストの Authorization ヘッダーに指定します。以下は、検証環境(IPアドレス: 172.31.34.176)に対してコマンドを実行した例です。

※コマンドの末尾に | jq を付けると結果が整形されて見やすくなります(要jqコマンドのインストール。RHEL9.4以降ではBaseOSに標準含まれています)。

【コマンド例】

curl -X POST -H 'Content-Type: application/json-rpc' -H 'Authorization: Bearer 82aa1b5b38a9fe6f6619ad40c64602dd' -d '
{
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
        "output": ["hostid", "host", "name"],
        "selectInventory": ["os", "hardware", "software"]
    },
    "id": 2
}' http://172.31.34.176/zabbix/api_jsonrpc.php | jq

【コマンド解説】

  1. curlコマンドの全体
項目内容
curlWebサーバーと通信を行うためのコマンドラインツール
-X POSTHTTPメソッドを「POST」に指定(Zabbix APIは必ずPOSTを使用します)
-H ‘Content-Type: application/json-rpc’送信するデータがJSON-RPC形式であることをZabbixサーバに伝えるヘッダ
-H ‘Authorization: Bearer <トークン>’取得した認証トークンを指定するヘッダ
-d ‘{ … }’Zabbixへ送信するリクエストの実データ(JSON)
http://…/zabbix/api_jsonrpc.phpリクエストの送信先となるZabbixサーバーのエンドポイントURL
| jq出力されるJSONデータを見やすく改行・色付けして整形するコマンド
  1. 送信するJSONデータ(-d の中身)
キー (” “)指定している値意味・役割
jsonrpc“2.0”JSON-RPCプロトコルのバージョン(”2.0″ 固定)
method“host.get”実行したいAPIの操作名。今回はホストデータの取得を指定
params{ … }検索条件や出力フォーマットなどを定義する引数
output[“hostid”, “host”, “name”]返却されるホストオブジェクトのフィールドを限定(全項目取得時は “extend”)
selectInventory[“os”, “hardware”, “software”]ホストに紐づくインベントリ情報を同時に取得するためのパラメータ
id2リクエストとレスポンスを紐づける任意の識別子


以下が取得結果です。
【取得結果】

{
  "jsonrpc": "2.0",
  "result": [
    {
      "hostid": "10084",
      "host": "Zabbix server",
      "name": "Zabbix server",
      "inventory": {
        "os": "Linux version 6.12.0-211.22.1.el10_2.x86_64 (mockbuild@df33c0284dd848a197e916486944b54f) (gcc (GCC) 14.3.1 20251022 (Red Hat 14.",
        "hardware": "",
        "software": ""
      }
    },
    {
      "hostid": "10782",
      "host": "WebServer1",
      "name": "WebServer1",
      "inventory": []
    }
  ],
  "id": 2
}
stuser

この検証環境では、監視対象に “Zabbix server” と “WebServer1” の2つが存在しています。

検証環境のZabbixサーバのホスト画面

  • “WebServer1” はWeb監視(URL外形監視など)のみを行っており、Zabbix Agentが導入されていないため、上記の結果のようにインベントリ情報が空([])になります。
  • 項目を絞り込まずにすべての情報を取得したい場合は、”output” や “selectInventory” に “extend” を指定します。また、IPアドレスなどのネットワーク情報を取得したい場合は “selectInterfaces”: “extend” を追加します。

【コマンド例】

$ curl -X POST -H 'Content-Type: application/json' -H 'Authorization: Bearer 7a6237f38929523f74cfb0acf8566f7f' -d '
{
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
        "output": "extend",
        "selectInterfaces": "extend",
        "selectInventory": "extend"
    },
    "id": 2
}' http://172.31.34.176/zabbix/api_jsonrpc.php | jq

取得できる項目の詳細は公式サイトをご参照ください。

Zabbix ドキュメント / 20 API
https://www.zabbix.com/documentation/current/jp/manual/api
Zabbix ドキュメント / 20 API / host.get
https://www.zabbix.com/documentation/current/jp/manual/api/reference/host/get

【補足】APIの認証とトークンの取得

  1. セッションの破棄(ログアウト)
    ステップ1で紹介した user.login メソッドで取得したトークンは、使い終わったら必ず user.logout を実行してセッションを破棄してください。破棄せずに放置すると、不要なセッションデータがデータベースに蓄積され、Zabbixのパフォーマンス低下を招く原因になります。

【セッション破棄のコマンド例】

  $ curl -X POST -H 'Content-Type: application/json' -H 'Authorization: Bearer 1da473d0437c7bf69a22e6e057ffc1d7' -d '
  {
      "jsonrpc": "2.0",
      "method": "user.logout",
      "params": [],
      "id": 3
  }' http://172.31.34.176/zabbix/api_jsonrpc.php | jq

  {
    "jsonrpc": "2.0",
    "result": true,
    "id": 3
  }
  1. 管理画面から発行する「APIトークン」の利用
    毎回ログイン・ログアウト処理を行うのが手間に感じる場合は、Zabbixの管理画面から有効期限を設定できる「APIトークン」を事前に発行して利用する方法がおすすめです。

    「ユーザー設定」→「APIトークン」を選択し、「APIトークンの作成」を選択します。

【APIトークン画面】   

 

【新規APIトークン画面】

ユーザは、ここではデフォルトのAdminを選択し、有効期限を設定しています。

【APIトークン表示画面】

前画面で追加ボタンを押すと、以下のように認証トークンが表示されます。

画面を一度閉じると二度と再表示できないため、必ず閉じる前に値を控えておきましょう。  

まとめ

Zabbixが標準で収集しているインベントリデータとZabbix APIを組み合わせれば、有償製品を別途導入しなくても、各サーバーの構成情報を一括取得・管理できます。

また、Zabbix APIは情報の取得だけでなく、ホストやアイテム、トリガーの自動作成なども行えるため、日々の監視設定そのものをスクリプトで自動化することも可能です。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。
エンジニア募集中!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です