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を使ってやることの概要
- Zabbixにログインし、認証トークンを入手する
- 認証トークンを用いて、event.getメソッドで特定ホストの過去のイベント情報を入手する
- 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/