第6回ZABBIX-JP勉強会で「運用を楽しくする話」

第6回ZABBIX-JP勉強会で「運用を楽しくする話」 はてなブックマーク - 第6回ZABBIX-JP勉強会で「運用を楽しくする話」


フューチャーアーキテクトさんのセミナールーム4月12日(土)、第6回ZABBIX-JP勉強会に参加&登壇の機会をいただきました。このエントリは、当日の発表に関する内容と、伝えきれなかった事の補足です。

登壇のきっかけとなった寺島さんはじめ、スタッフの皆さんありがとうございました。参加された皆さん、お疲れ様でした。左の写真は、会場を提供されたフューチャーアーキテクトさんのセミナールーム入り口。ありがとうございました。

■ ZabbixのAPIを使って運用を楽しくする話

発表の内容は、以下の三本建てでした。

  • 1. ZABBIX API 超入門 ( shell 上で始める API )
  • 2. Serf と Zabbix の連携
  • 3. 仕事は楽しいかね? ←(ポエム的な)

テーマは、いかに仕事を楽しくするのか、というのを考えていました。Zabbix を使った運用だったり設定を楽にするだけじゃなく、仕事を楽しくというコンセプト。そのために、API の活用は欠かせません。また、API を使う事ができれば、他のツールとの連携もスムーズです。たとえば、オーケストレーションツールである Serf を使い、運用設定の自動化に活用することもできます。

■ ZABBIX API 超入門

世の中のサービスやアプリケーションには、様々な API ( Application Programing Interface ) が提供されています。ZABBIX にも JSON-RPC 2.0 の仕様に従った API が提供されています。

API というと、一般的に、どうも難しそうであったり、複雑なプログラミングの知識が必要と思われがちです。ですが、ZABBIX が提供している API は、コマンドライン上でも簡単に試せるもので、比較的手軽に利用出来ます。

提供されている API は幅広く、基本的にウェブを通して利用可能な機能は、ほぼ全て、API を通して実行できます。API をうまく使えば、ホストの登録・削除だけでなく、グラフやスクリーンなどの手がかかる作業の省力化に使う事も可能です。

さて、ZABBIX API を使う前に準備するのは、curl と jq です。

  • curl … 様々な通信が可能なコマンドライン・インターフェース
  • jq … JSON 形式のデータを加工 ( grep したり awk や sed っぽく使う )

curl は、Linux 環境上では、ほぼ始めから入っているものです。また、jq は、JSON 形式のデータを加工したり、人間にとって読みやすく整形できますので、ZABBIX 以外にも重宝する便利なツールです。jq は、RHEL/CentOS 環境であれば EPEL レポジトリで “yum install jq” を実行するだけでセットアップ出来ます。

では、ツールの用意が出来たあとは、実際に ZABBIX に対してリクエストを行います。このリクエストには curl を使って、HTTP を通してアクセスします。処理の流れは、まずブラウザでアクセスする時と同様の ID とパスワードと用いた認証を行い、トークン(token)を取得します。トークンを取得したあとは、ZABBIX の様々な API を呼び出すことになります。

たとえば、ホスト情報の一覧を表示するには、次のようなデータの流れになります。

トークンを取得するためには、まず「user.login」というメソッド名のリクエストを、Zabbix サーバに対して送ります。送るためのデータ形式は、以下のようになります。

{
  "id": 1,
  "params": {
    "user": "zabbixid",
    "password": "pass"
  },
  "method": "user.login",
  "jsonrpc": "2.0"
}

“user” と “password’ は、Zabbix のウェブインターフェースにログインするものと同一です。管理上、’admin’ などのユーザとは別に、API 専用のユーザを発行しておくと、後々セキュリティ上の管理で楽になると思います。

では、実際に API にアクセスするには、curl を使って次のように実行します。

$ curl -s -XGET \
    -H "Content-Type:application/json-rpc“ \
    -d '{"id":1,"params":{"user":"zabbixid","password":"pass"},"method":"user.login","jsonrpc":2.0"}' \
    http://127.0.0.1/zabbix/api_jsonrpc.php | jq -r '.result'

‘-s’ は、表示上のメッセージで邪魔になるものを非表示とし、’-XGET’ は GET リクエストを行い、’-H’ でヘッダの宣言、そして ‘-d’ で、 JSON データを指定します。最後に jq にパイプし、結果を整形して表示します。正常に実行されると、トークンが表示されます。

次は、ここで取得したトークンを再利用し、ホスト一覧 ‘host.get‘ メソッドを実行します。次は、’-d’ のデータ部分を、host.get 向けに書き直します。

{
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
        "output": "extend"
    },
    "id": 2,
    "auth": "ここに取得したトークンを記述"
}

重要なのは「auth」で取得したトークンを記述することです。一度認証してトークンを取得してしまえば、都度 ID とパスワードを送る必要はありません。ただし、再度user.login を発行したり、時間が経つとトークンは無効化されますので、注意が必要です。

ZABBIX に対しては、引き続き curl を使ってデータを送ることができます。基本的に、先ほどのトークン取得時と変わりません。’-d’ の JSON データ部分のみ書き換えが必要です。

$ curl -s -XGET \
    -H "Content-Type:application/json-rpc“ \
    -d '{"jsonrpc": "2.0","method": "host.get","params":{"output": "extend"},"id": 2,"auth": "ここに取得したトークンを記述"}' \
    http://127.0.0.1/zabbix/api_jsonrpc.php | jq '.'

これで、ZABBIX 上に登録されているホスト情報の一覧が表示されます。表示される項目は多岐にわたりますので、必要に応じて jq を使ってフィルタします。

なお、トークン取得から JSON リクエスト発行までをまとめたシェルスクリプトを GitHub に置いていますので、よろしければ参考にどうぞ。

このように、ホスト情報を一覧表示するだけでなく、ZABBIX には様々な API が用意されています。詳細については、公式ドキュメントの説明(英語)をご覧ください。

■ Serf と ZABBIX API の連携で、設定自動化

API を扱う事が出来れば、様々なツールと連携することが可能になります。今回は、実際の活用例として、オーケストレーションツールの Serf と連携する方法を紹介します。

まず Serf とは、Vagrant の作者さん Mitchell Hashimoto 氏が所属する会社が開発中のツールで、オープンソースとして公開されています。ツールは、イベントの同時実行や、障害検知、そしてメンバーシップ(ノードの管理や状況の検出)に特化しているものです。昨年に発表されて以降、積極的に開発が行われています。

Serf の特長の1つ、ノード検出に注目し、Serf ノードに加わるタイミングで、Zabbix のホストに自動登録したり、グラフの作成を行うものです。全体の処理としては、次のような流れで行います。

一見すると複雑に見えるかもしれませんが、処理そのものはシンプルです。

Zabbix サーバが稼働するホスト上で、Serf ノード群を管理するツール群をセットアップしています。このツールは、Serf ノードがクラスタに参加したり離脱するタイミングで、イベントを発行します。イベントの処理内容は Perl で書かれたスクリプトで、Zabbix API を使ったリクエストを行い、ホストの追加やグラフの制御を行います。

ポイントとなるのは、ZABBIX 内部の hostid (ZABBIX が監視対象を識別する一意の数値) を、Serf のタグに登録することでした。ZABBIX では、さまざまな操作を行うために ‘hostid’ が重要な役割を果たします。そのため、Serf のタグに登録しておけば、都度ツール群が ZABBIX Server に問い合わせる必要が無いため、スムーズな処理が可能となります。

また、Serf 登録時に role (ロール=役割)を定義することで、role に応じて動的に ZABBIX 監視テンプレートを適用させることができます。

この仕組みをうまく使えば、左図のようなスクリーン上にホストを登録するのも一瞬です。

また、特定のメトリクスを、1つのグラフに集めるのも楽になります(例えば、role が Web のグラフ群と、DB のグラフ群を)。

ちなみに、当日の寺島さんの発表によると、この機能は ZABBIX 2.4 で標準搭載されるように実装が進んでいるようです。なかなか手間が掛かって面倒だったので、有り難いですね。

ちなみに、ノードの追加・削除のタイミングで、ZABBIX の登録・削除だけでなく、role が web の場合は、LVS と連携することも行っていました。

Serf を使えば、日常の運用上で「面倒な事」を「簡単」に抽象化することが出来ます。しかも、複雑なツールや環境のセットアップは必要無く、単純にエージェントを立ち上げるだけ。イベントハンドラ、と呼ばれる処理の仕組みも、シェルスクリプトが書けるレベルで十分に機能します。

Serf は、アイディアを比較的に形にしやすいと思います。ZABBIX のみならず、色々な運用現場で使えそうなシーンがあれば、どんどん導入していくと、面白いんじゃないかなと思っています。

#本当は、こういう仕組みを前職の時にフル活用したかった、と個人的に非常に悔しく思っています。今は、運用現場から離れてしまいましたが、現場だったらゼッタイ活用していたと思います。

■ 感想、その他

当日は、発表の中でデモに挑戦しました。ZABBIX と Serf が連携する環境を、ローカルの VirtualBox 上で予め構築していたのですが、割り当てメモリが少なすぎたようで、mysqld の oom-killer が発動して手間取るなど、お見苦しいことになり申し訳ありませんでした。。ネットワーク経由のデモだと、通信状況によっては失敗すると思い、ローカルに環境を構築していたのですが、準備不足が徒となりました。なかなか難しいですね。。

それと、やはりこういう勉強会に参加すると、色々な切っ掛けなり気付きがあって良いですね。特に、他の方も言及されていますが、zabbix_sender  と Low Level Discovery を組みあわせるのは、アイディアが膨らんで、活用のしがいがあると感じました。

あとは、これまでお会いできなかった皆さんと、直接ご挨拶できてよかったです。繰り返しとなりますが、登壇された皆さん、参加された皆さん、そしてスタッフのみなさま、ありがとうございました。

■ 参考情報

ZABBIX API に関する一次情報

Getting started with Zabbix API | Zabbix Weblog
http://blog.zabbix.com/getting-started-with-zabbix-api/1381/
ドキュメント
https://www.zabbix.com/documentation/2.2/manual/api

日本語の ZABBIX API 情報

第4回 Zabbix APIを使った外部ツールとの連携 | Think IT ← @ike_dai さんの記事
http://thinkit.co.jp/story/2012/05/11/3541
Perl から Zabbix API を叩いてみる。 – 双六工場日誌 ← @sechiro さんの記事
http://sechiro.hatenablog.com/entry/20101218/1292639424
ZabbixAPI触ってみた – mikedaの日記 ← @mikeda さんの記事
http://mikeda.hatenablog.com/entry/20110501/1304228313
Zabbix API を始める人向けの情報をまとめてみた  ← @halchiyo さんの記事
http://log4hc.wordpress.com/2012/08/10/zabbix_api_summary/