ようへいの日々精進XP

よかろうもん

Amazon Linux 上に sensu-server を構築する(2)

補足

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-serversensu-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-pluginREADME を斜め読みすると...

サンプルを試す

ということで 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

放置しておくと...

f:id:inokara:20140309030744p:plain

ちゃんと 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.jsoncommand パスと差し替えて sensu-client を再起動して暫く待つと...

f:id:inokara:20140309032441p:plain

おお、ちゃんと 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

まあ、何はともあれシェルスクリプトでもチェックプログラムを書けるのはだいぶん嬉しい。また、sensuNagiosプラグインも利用出来るというのはこの辺りが所以なのかもしれない。


引き続き

sensu 楽しいなあ。あと、今更だけど sensu が吐くログって JSON なのが嬉しい。