PHP 5分でわかる! Zabbix API の使い方(ホスト一覧の取得)

Zabbix
Zabbix
スポンサーリンク

Zabbix API を使うと、プログラムやコマンドラインから、ホストを追加したり、監視データを取得することが出来ます。自動化ツールの Chef 等と組み合わせれば、サーバの監視設定までもを自動化することが可能です。API と聞くと少し難解なイメージがありますが、Zabbix API は JSON-RPC 2.0 のシンプルな仕様に準拠しているため、比較的簡単に使えるようです。そこで今回は、PHP から Zabbix API の基本的な使い方をご紹介します。

Zabbix API のバージョン取得

まず初めに、JSON-RPC 2.0 での基本的なリクエスト方法とレスポンスを確認するため、Zabbix API のバージョンを取得してみます。

リクエストデータの作成

$request = array(
    'jsonrpc'   => '2.0',
    'method'    => 'apiinfo.version',
    'id'        => 1,
    'auth'      => null,
    'params'    => array(),
);

jsonrpc
 JSON-RPCのプロトコルバージョンを指定します。このパラメータは必ず「2.0」を設定します。

method
 Zabbix API メソッドを指定。今回は API バージョンを取得する apiinfo.version メソッドを設定します。

id
 ここで指定した値が、レスポンスでもそのまま返ってきます。複数のリクエストとレスポンスを識別するために使います。リクエストが1つであれば「1」を設定しておけば良いでしょう。

auth
 アクセストークンを指定します。ほとんどのメソッドでは、このパラメータが必須になりますが、バージョンを取得するだけの apiinfo.version メソッドでは必要ありませんので null を設定しておきます。

params
 メソッドに渡すパラメータを指定します。こちらも apiinfo.version メソッドでは必要無いため、空の配列を設定します。

リクエストデータを JSON 形式に変換

Zabbix API とやりとりするデータは、JSON 形式を使いますので、JSON 形式に変換しておきます。

$request_json = json_encode($request);

HTTPストリームコンテキストの作成

Zabbix API へ POST 送信するための下準備です。PHPでは stream_context_create を使うのが手軽です。

$opts['http'] = array(
    'method'    => 'POST',
    'header'    => 'Content-Type: application/json-rpc',
    'content'   => $request_json,
);
$context = stream_context_create($opts);

method
 HTTPメソッドの指定です。「POST」を設定します。

header
 HTTPヘッダの指定です。必ず「Content-Type: application/json-rpc」設定します。

content
 先ほど作成した JSON形式のリクエストデータを設定します。

リクエストの実行

後は、Zabbix API にリクエストを送るだけです。API の URL は下記のようになります。

https://【管理画面のURL】/api_jsonrpc.php

アクセストークンを取得する時に、管理ユーザのパスワードを送信しますので、HTTPS を使うことをオススメします。

$url = 'https://example.com/zabbix/api_jsonrpc.php';
$response_json = file_get_contents($url, false, $context);

レスポンスの表示

JSON形式でレスポンスが返ってきます。内容を確認しやすいように、配列に変換してから表示します。

$response = json_decode($response_json, true);
var_dump($response);

まとめると、以下のようなプログラムになります。「リクエストデータの作成」以外の処理は、基本的にどの Zabbix APIメソッドを使っても同じです。

<?php
// リクエストデータの作成
$request = array(
    'jsonrpc'   => '2.0',
    'method'    => 'apiinfo.version',
    'id'        => 1,
    'auth'      => null,
    'params'    => array(),
);

// リクエストデータを JSON 形式に変換
$request_json = json_encode($request);

// HTTPストリームコンテキストの作成
$opts['http'] = array(
    'method'    => 'POST',
    'header'    => 'Content-Type: application/json-rpc',
    'content'   => $request_json,
);
$context = stream_context_create($opts);

// リクエストの実行
$url = 'https://example.com/zabbix/api_jsonrpc.php';
$response_json = file_get_contents($url, false, $context);

// レスポンスの表示
$response = json_decode($response_json, true);
var_dump($response);

プログラムを実行すると、以下のようなレスポンスが表示されます。result が Zabbix API のバージョンです。id にはリクエストと同じ「1」が返ってきていることも確認できますね。

array(3) {
  ["jsonrpc"]=>
  string(3) "2.0"
  ["result"]=>
  string(5) "2.4.2"
  ["id"]=>
  int(1)
}

Zabbix API アクセストークンの取得

先にも書きましたが、ほとんどの Zabbix API メソッド使うには、アクセストークンが必要になります。

アクセストークンの取得は user.login メソッドを使います。メソッドに渡すパラメータに、管理ユーザ名とパスワードを設定します。

$request = array(
    'jsonrpc'   => '2.0',
    'method'    => 'user.login',
    'params'    => array(
        'user'      => 'Admin', ←管理ユーザ名
        'password'  => 'zabbix', ←パスワード
    ),
    'id'        => 1,
    'auth'      => null,
);

リクエストデータ以外の処理は、バージョン取得の時と同じです。
プログラムを実行すると、以下のようなレスポンスが返ってきます。result が アクセストークンです。

array(3) {
  ["jsonrpc"]=>
  string(3) "2.0"
  ["result"]=>
  string(32) "f6ae88c261483c1ec3b6ceb0df6d7fa6"
  ["id"]=>
  int(1)
}

監視ホスト一覧の取得

アクセストークンが取得できましたので、試しに監視ホストの一覧を取得してみます。

監視ホストの一覧は host.get メソッドを使います。先ほど取得したアクセストークンを auth パラメータに設定します。

$request = array(
    'jsonrpc'   => '2.0',
    'method'    => 'host.get',
    'params'    => array(
        'output'            => array('hostid', 'host'),
        'selectInterfaces'  => array('interfaceid', 'ip'),
    ),
    'id'        => 1,
    'auth'      => 'ddadcf12532aaf8c41edff2a13a2202e',
);

プログラムを実行すると、以下のようなレスポンスが返ってきます。メソッドに渡すパラメータで指定すれば、監視ホストの色々な情報が取得できます。指定できるパラメータは 公式マニュアル をご参照ください。

array(3) {
  ["jsonrpc"]=>
  string(3) "2.0"
  ["result"]=>
  array(2) {
    [0]=>
    array(3) {
      ["hostid"]=>
      string(5) "10084"
      ["host"]=>
      string(13) "Zabbix server"
      ["interfaces"]=>
      array(1) {
        [0]=>
        array(2) {
          ["interfaceid"]=>
          string(1) "1"
          ["ip"]=>
          string(9) "127.0.0.1"
        }
      }
    }
    [1]=>
    array(3) {
      ["hostid"]=>
      string(5) "10105"
      ["host"]=>
      string(6) "LAMP01"
      ["interfaces"]=>
      array(2) {
        [0]=>
        array(2) {
          ["interfaceid"]=>
          string(1) "2"
          ["ip"]=>
          string(11) "172.16.1.20"
        }
        [1]=>
        array(2) {
          ["interfaceid"]=>
          string(1) "3"
          ["ip"]=>
          string(11) "172.16.1.20"
        }
      }
    }
  }
  ["id"]=>
  int(1)
}

Zabbix API の公式マニュアル

Zabbix API は公式マニュアルがとても充実しています。詳細は下記をご参照ください。

▽ Zabbix API マニュアル
https://www.zabbix.com/documentation/2.4/manual/api

▽ Zabbix API メソッドの一覧
https://www.zabbix.com/documentation/2.4/manual/api/reference

終わりに

Zabbix API のことを色々調べていたら、公式トレーニングの記事を見つけました。受講には Zabbix の認定資格が必要なようですが、その分しっかり学べそうですね。

▽ Zabbix API公式トレーニングが10月より提供開始 | マイナビニュース
http://news.mynavi.jp/news/2015/08/04/197/

コメント

タイトルとURLをコピーしました