SKY BLOGBLOG

Zabbix APIを使ってみよう

MSP部の岩﨑です。 

新卒で入社して4年目になります。

前回書いたブログ「AmazonLinux2にZabbix5.0を構築」が、約1年前と気づいて時の流れの速さを感じます。歳でしょうか。

今回はZabbix APIを少し勉強したので、みなさんの初めの1歩の力添えになれるよう入門編を書きます。

お手柔らかに。

主に参照するドキュメントとブログ

今回、主に参照していくのはZabbixの公式ドキュメントと公式ブログの2つです。

Zabbixのドキュメントはバージョン2.2以降、日本語になかなか恵まれなかったのですがバージョン6.0は日本語が選択可能ですので

6.0のものを見ていきます。

また、ブログは「Zabbix API scripting via curl and jq」を見ていきます。

Zabbix APIとは?

ドキュメントから引用すると以下のとおりです。夢や希望に満ち溢れていますね。

実際、社内でもZabbix APIは大いに利用されています。

Zabbix APIは、プログラムでZabbixの設定を取得、変更することができ、過去のデータにアクセスすることができます。
以下のような用途で広く利用されています。

  •   Zabbixと連携する新しいアプリケーションを作成する。
  •   Zabbixとサードパーティソフトウェアの統合。
  •   定型タスクの自動化

https://www.zabbix.com/documentation/6.0/jp/manual/api

■今回の実行環境

  • Zabbixサーバー(Zabbix5.0系:前回ブログで作成したものなのでAmazonLinux2を使用しています

■今回準備が必要なもの

  • Zabbixサーバーに登録された、表示/設定が可能なユーザー
  • jqコマンド(JSONの出力結果が整形して返ってくるようにするため
  • curlコマンド(Zabbix APIはWebベースのAPIのため、HTTPでアクセスします)
  • 便利なテキストエディタ(私はサクラエディタです)

 

これからAPIを使ってやることの概要

  1. Zabbixにログインし、認証トークンを入手する
  2. 認証トークンを用いて、event.getメソッドで特定ホストの過去のイベント情報を入手する
  3. Zabbixからログアウトして、認証トークンを放棄する

①Zabbixにログインし、認証トークンを入手する

ZabbixサーバーにSSH接続します。

jqがインストールされていない場合は、インストールしてください。

環境変数「url」にサーバー自身のZabbixのフロントエンドを設定します。コマンドは以下。

url=http://localhost/zabbix/api_jsonrpc.php

設定後、以下で設定できていることを確認しましょう。

echo $url

次に、以下のコマンドで環境変数「auth」を設定します。authには認証トークンが設定されます。

また★にはユーザー名と●にはパスワードがそれぞれ入ります。

auth=$(curl -s -X POST -H 'Content-Type: application/json-rpc' \
-d '
{"jsonrpc":"2.0","method":"user.login","params":
{"user":"★","password":"●"},
"id":1,"auth":null}
' $url | \
jq -r .result
)

パイプで繋いでいるjqコマンドのオプションについても確認します。

-r:ダブルクォートを取り除く

なるほど()。。。

 

先程設定した環境変数「auth」が32桁の英数字となっていることを確認します。これが認証トークンとなります。

echo $auth

②認証トークンを用いて、event.getメソッドで特定ホストの過去のイベント情報を入手する

認証トークンを入手したので、早速event.getメソッドを使用していきます。

■event.get

https://www.zabbix.com/documentation/6.0/jp/manual/api/reference/event/get

■付録 1. 参考文献の解説

https://www.zabbix.com/documentation/6.0/jp/manual/api/reference_commentary

ところで、ZabbixAPIでリクエストする際のリクエストの構成要素は以下のとおりです。

jsonrpc:おまじないみたいなもの

method:特定のAPIメソッド

params:APIメソッドに渡されるパラメータ

id:リクエストを識別するための任意の識別子

auth:認証トークン

これに照らし合わせて、event.getメソッドで利用できるパラメータを調べつつJSONを記述していきます。

{     "jsonrpc": "2.0",     "method": "event.get",     "params": {         "hostids": "10084",         "output": [           "name",           "eventid"           ],         "sortorder": "desc"     },     "auth": "$auth",     "id": 1 }

頑張って記述しないといけないのはパラメータです。

ドキュメントを参照してどういったパラメータがあり、出力されるプロパティ(今回はイベントのオブジェクトプロパティ)はなにがあるのかを確認して記述する必要があります。

上記はホストIDでホストを特定し、イベント名(トリガー名)とイベントIDのプロパティのみを出力するようにOutputで指定しています。

sortorderでは降順を指定しています。

さて、用意したJSONをテキストエディタで「”」(ダブルクォーテーション)を「\"」に置換します。これはエスケープするためです。

そして、以下のようにcurlコマンドの引数にエスケープ処理が完了したJSONを指定して、コマンド実行します。

curl -s -X POST \
-H 'Content-Type: application/json-rpc' \
-d " \

{
    \"jsonrpc\": \"2.0\",
    \"method\": \"event.get\",
    \"params\": {
        \"hostids\": \"10084\",
        \"output\": [
          \"name\",
          \"eventid\"
          ],
        \"sortorder\": \"desc\"
    },
    \"auth\": \"$auth\",
    \"id\": 1
}

" $url | jq .

結果は以下のようになりました。

{
  "jsonrpc": "2.0",
  "result": [
    {
      "eventid": "50",
      "name": "テスト用トリガ"
    },
    {
      "eventid": "51",
      "name": "テスト用トリガ"
    },
    (省略)
    {
      "eventid": "2910",
      "name": "Zabbix unreachable poller processes more than 75% busy"
    },
    {
      "eventid": "2911",
      "name": "Zabbix server: Utilization of unreachable poller processes over 75%"
    }
  ],
  "id": 1
}
 

今回は期間を絞っていないため100件近くイベントが出力されました。

パラメータを詳細に記載すれば、よりたくさんの情報を出力させることが可能です。

③Zabbixからログアウトして、認証トークンを放棄する

ここまで満足したら、最後はログアウトします。

以下のコマンドでログアウトしてください。

curl -s -X POST \
-H 'Content-Type: application/json-rpc' \
-d " \
{
    \"jsonrpc\": \"2.0\",
    \"method\": \"user.logout\",
    \"params\": [],
    \"id\": 1,
    \"auth\": \"$auth\"
}
" $url

このログアウト以降、ログイン以外では「Session terminated, re-login, please.」となります。

再度ログインして認証トークンの取得が必要になります。

ちなみに、user.loginメソッドのドキュメントには以下の記載があるので要注意です。

 このメソッドを使用する場合はuser.logoutを実行して、開いているセッションレコードが大量に生成されないようにする必要もあります。

 

最後に

長い上に少し雑でしたが、Zabbix APIの一歩はこんな感じでしょうか。

Zabbix APIの肝は、メソッドの選択とパラメータを指定して、適切なJSONを記述するところだと感じました。

Zabbix APIを活用して運用・監視のさらなる自動化を目指していきたいと思います。

参考

https://www.zabbix.com/documentation/6.0/jp/manual/api

https://www.zabbix.com/documentation/6.0/jp/manual/api/reference/event/get

https://www.zabbix.com/documentation/6.0/jp/manual/api/reference/event/object

https://www.zabbix.com/documentation/6.0/jp/manual/api/reference_commentary

https://blog.zabbix.com/zabbix-api-scripting-via-curl-and-jq/12434/