Posted on May 6
前回の記事で Chef には Handlers と呼ばれるレポート機能が備わっていることを知った。レポートの出力先としては JSON ファイルや IRC 等があり、みんな大好き、私も大好き(になろうと頑張る)Graphite に出力出来るようなので試してみたいと思う。尚、Fluentd にも出力することが出来るようなので(以下、参考リンク)活用の機会が広がるような気がしている。
135 ページから 145 ページの「5.7.1 ハンドラ(Chef::Handler)」)13 ページから 18 ページあたりで Handlers について言及されている)登場人物(Chef Handlers と Graphite)について。
Chef Client のレポーティング機能Start Handlers と Report Handlers と Exception Handlers の三種類node の情報、経過時間、例外が発生した際の各種情報等を取得可能JSON ファイル以外にも書き出し先は選べるし自作も可能Chef::Handler を継承して独自のハンドラを作成することも可能Python で実装されているcarbon と whisper そして graphite webapp という三つのコンポーネントで構成されているcarbon は Twisted というデーモンツールで時系列データを収集する役目whisper は時系列データを保存しておくデータベース graphite webapp は whisper からデータを取り出してグラフを描画するGraphite について @y_uuk1 さんの以下の資料の図が個人的には一番解りやすかったので拝借させて頂きます…
上の一枚だけで概要は掴めるかと。
Chef Handlers と Graphite を設定。 利用した環境は下記の通り。
CentOS 6 の AMIm3.mediumchef-11.12.4-1.el6.x86_64(オムニバスインストーラーからインストール)既に Chef はセットアップされた状態から、chef-handler-graphite をgem を使ってインストールする。
インストールは下記のように行った。
/opt/chef/embedded/bin/gem install chef-handler-graphite --no-ri --no-rdoc -V
これだけ…簡単。
設定は以下のページに書いた。
Graphite-web の初期設定を行う場合に以下を実行する。
/usr/lib/python2.6/site-packages/graphite/manage.py syncdb
実行すると以下のようにユーザー名やパスワードを問われる。

詳細の出力については以下の通り。
設定後、ブラウザで Graphite ホストにアクセスすると…

これで Graphite は使える状態になった。
Chef Handlers は Cookbook 内に設定するか、client.rb や solo.rb に設定すれば利用出来るとのことなので、solo.rb に設定してみる。
solo.rb に以下を追加する。
require 'chef-handler-graphite'
graphite_handler = GraphiteReporting.new
graphite_handler.metric_key = "kappatest.chef.#{Chef::Config.node_name}"
graphite_handler.graphite_host = "localhost"
graphite_handler.graphite_port = "2003"
report_handlers << graphite_handler
exception_handlers << graphite_handler
テストに以下の Cookbook を選んだ。
Berksfile に以下を追加して…
source "https://api.berkshelf.com"
cookbook "java"
cookbook "elasticsearch"
berks vendor を実行する。
/opt/chef/embedded/bin/berks vendor cookbooks
以下のように run_list を用意する。
{
"name": "elasticsearch-cookbook-test",
"run_list": [
"recipe[java]",
"recipe[elasticsearch]"
],
"java": {
"install_flavor": "openjdk",
"jdk_version": "7"
},
"elasticsearch": {
"cluster" : { "name" : "elasticsearch_test_chef" }
}
}
run_list を用意したら以下のようにして Cookbook を適用する。
chef-solo -c solo.rb -j nodes/localhost.json
ちなみに、-W オプションつけて何度か why-run で試してもみた。Cookbook 適用後に以下のように表示された。

おお、ちなみに Graphite の方は…

おお。
以下のような値が Graphite で確認することが出来る。
all_resources は run_list に定義されたレシピの各種リソース(の数)elapsed_time は start_time と end_time の差を表現fail は例外を含んでいる(数)success は例外を含んでいない(数)updated_resources は all_resources のうちで Chef::Runner によって変更されたリソース(の数)詳細については以下を参考になる。
上記を参考にしながら Graphite のグラフを眺めているとより理解が深まる…(かも)。
Chef Handlers をやっと試せたHandlers を活用していきたいGraphite に飛ばすだけだったが、fluentd を介して MongoDB 等に保存するという事例もあるGraphite の使い方もなんとなく解ってきたのは良かった2014 かっぱのほげふが