補足
id:kukita さんより下記のようなコメントを頂きました。
Sensu インストール時に生成される /etc/default/sensu というファイルの中身を EMBEDDED_RUBY=true に書き換えることで、 omnibus パッケージ下の ruby が有効になり、追加のインストールが不要になります。ご参考までに。
コメント有難うございました!
ドキュメントの FAQ にも...
How can I use the Sensu embedded Ruby for checks and handlers?
の部分で...
You can use the embedded Ruby by setting EMBEDDED_RUBY=true in /etc/default/sensu. The Sensu init scripts will set PATH and GEM_PATH appropriately.
の書かれておりました。監視システムとしては(ホスト上で動くアプリケーション等に影響を与えないようにするという意味で)組み込みの Ruby
を使うほうが良さそうです。
はじめに
- 前回の記事の補足というか設定を進める上での私的な注意点
- sensu-plugin を利用しようとする場合の注意点等
sensu の Ruby とはじめからインストールされている Ruby
はじめからインストールされている RUby
Amazon Linux
を素の状態で利用する場合、既に Ruby
はインストールされているものの...
ruby-rdoc-1.8.7.374-2.11.amzn1.noarch ruby-devel-1.8.7.374-2.11.amzn1.x86_64 ruby-1.8.7.374-2.11.amzn1.x86_64 ruby-libs-1.8.7.374-2.11.amzn1.x86_64 ruby-irb-1.8.7.374-2.11.amzn1.noarch rubygems-1.8.25-8.12.amzn1.noarch
バージョンは上記の通り 1.8.7
となっている。古い。
え...sensu-* はどうやって動いているの?
上記のように Ruby
のバージョンが 1.8.7
でも sensu-server
等の sensu-*
シリーズは動作している。これは sensu-*
シリーズは yum
でインストールした際に一緒にインストールされる組み込みの Ruby
を利用しているからだと思われる。実際に /opt/sensu/embedded/bin
には ruby
がインストールされておりバージョンを確認すると...
ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-linux]
上記のように 2.0.0 がインストールされている。
sensu-server
や sensu-api
等は /opt/sensu/embedded/bin/ruby
を使うので、まあ良いとして sensu-plugin を利用しようとするとそうは問屋が卸さなかった。
追加のインストール
sensu-plugin を利用しようとする場合には以下のように rpm
パッケージと gem
を追加でインストール必要がある。
sudo yum install rubygems ruby-devel gcc sudo gem install sensu-plugin --no-rdoc --no-ri -V
また、Ruby
バージョンの古さが嫌な場合には 1.9 系をインストールするのもアリかと(自分はそうした)。
sudo yum install ruby19 rubygems19 ruby19-devel gcc
インストール後、sudo update-alternatives --config ruby
を実行してデフォルトの Ruby
バージョンを変更する。
2 プログラムがあり 'ruby' を提供します。 選択 コマンド ----------------------------------------------- *+ 1 /usr/bin/ruby1.8 2 /usr/bin/ruby1.9 Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:
2
を選択する。
sensu-plugin
sensu-plugin は README を斜め読みすると...
サンプルを試す
ということで README に記載されていた以下のサンプルを /etc/sensu/plugins/check-hoge.rb
で保存。
#!/usr/bin/env ruby require 'sensu-plugin/check/cli' class MyCheck < Sensu::Plugin::Check::CLI check_name 'check-hoge' # defaults to class name option :foo, :short => '-f' # Mixlib::CLI is included def run ok "All is well" end end
合わせて /etc/sensu/conf.d/check_hoge.json
を以下のように記載して...
{ "checks": { "hoge_check": { "handlers": ["default"], "command": "/etc/sensu/plugins/check-hoge.rb", "interval": 60, "standalone": true } } }
sensu-client
を再起動。暫くすると以下のようなログが sensu-client
のログ(/var/log/sensu/sensu-client.log
)に記録されるようになる。
{"timestamp":"2014-03-08T17:52:44.796566+0000","level":"info","message":"publishing check result","payload":{"client":"test-node01","check":{"handlers":["default"],"command":"/etc/sensu/plugins/check-hoge.rb","interval":60,"standalone":true,"name":"hoge_check","issued":1394301164,"executed":1394301164,"output":"check-hoge OK: All is well\n","status":0,"duration":0.07199999999999999}}}
簡単なサンプル位は自分で書ければ良いのだがスキル不足が悔しい。ちなみに、先ほどの check-hoge.rb
を以下のように書き換えて...
--- check-hoge.rb.original 2014-03-08 18:02:55.418046683 +0000 +++ check-hoge.rb 2014-03-08 18:00:56.255620577 +0000 @@ -7,7 +7,7 @@ option :foo, :short => '-f' # Mixlib::CLI is included def run - ok "All is well" + critical end end
放置しておくと...
ちゃんと critical
を判断してアラートを上げてくれる。
シェルスクリプトでも
README を読み進めると...以下のような記述がある。
This will output the string “my_awesome_check OK: All is well” (like a Nagios plugin), and exit with a code of 0.
ふむふむ、どうやらチェックプログラムの終了コードが 0
だったり 1
だったりを sensu-client
に投げてあげることが出来れば Ruby
でも何でもチェックプログラムとして利用出来るのねということでシェルスクリプトで以下のように書いてみた。
#!/bin/bash echo "ok" exit 1
これを check_hoge.json
の command
パスと差し替えて sensu-client
を再起動して暫く待つと...
おお、ちゃんと warning
で検出されている。ちなみに、上記の README
抜粋にあるようにlike a Nagios plugin
なので終了コードをこちらを参考に以下のようにすれば良い。
Plugin Return Code | Service State | Host State |
---|---|---|
0 | OK | UP |
1 | WARNING | UP or DOWN/UNREACHABLE* |
2 | CRITICAL | DOWN/UNREACHABLE |
3 | UNKNOWN | DOWN/UNREACHABLE |
まあ、何はともあれシェルスクリプトでもチェックプログラムを書けるのはだいぶん嬉しい。また、sensu
が Nagios
のプラグインも利用出来るというのはこの辺りが所以なのかもしれない。
引き続き
sensu
楽しいなあ。あと、今更だけど sensu
が吐くログって JSON
なのが嬉しい。