Sensuに通知処理を追加する

通知としては、メールとhipchatを使おうと思う。

プラグインこちらで 公開されているのでダウンロードし、 files/default/handlers 以下に プラグインを配置する。

プラグインには、#!/usr/bin/env ruby と記述されているが、
sensuインストール時に一緒にインストールされるrubyで実行するため、 一行目の #!/usr/bin/env ruby#!/opt/sensu/embedded/bin/ruby に変更する。

次に、recipe/server.rbに

remote_directory "/etc/sensu/handlers/" do
  source "handlers"
  owner "sensu"
  group "sensu"
  mode "0755"
  files_mode "0755"
end

を記述し、以後通知のプラグインを追加する際は、このディレクトリー以下に入れるようにする。

メールによる通知

attributes/server.rbにパラメータを追加する

default['mailer']['from'] = 'sensu@hoge.com'
default['mailer']['to'] = 'hoge@hoge.com'
default['mailer']['smtp_enable_starttls_auto'] = 'false'
default['mailer']['smtp_address'] = 'smtp.hoge.com'
default['mailer']['smtp_port'] = '25'
default['mailer']['smtp_domain'] = 'hoge.com'
default['mailer']['admin_gui'] = "http://xxxxxxxx.hoge.com"

TLSを使用しない場合は、smtp_enable_starttls_autoは falseでOK。 admin_guiは管理画面のURLを記述する。(メールの本文に表示される)

次にメール設定を行う処理をrecipes/server.rb に以下を追記する。 gemも必要だったので、併せてインストールするようにした。

sensu_handler "mailer" do
  type "pipe"
  command "mailer.rb"
end

execute 'install gem mail' do
  command "/opt/sensu/embedded/bin/gem install mail -v 2.5.4"
end

mailer = node['mailer']
sensu_json_file "#{node.sensu.directory}/conf.d/mailer.json" do
  owner "sensu"
  group "sensu"
  mode "0640"
  content({
    mailer: {
      mail_from: mailer['from'],
      mail_to: mailer['to'],
      smtp_enable_starttls_auto: mailer['smtp_enable_starttls_auto'],
      smtp_address: mailer['smtp_address'],
      smtp_port: mailer['smtp_port'],
      smtp_domain: mailer['smtp_domain'],
      admin_gui: mailer['admin_gui']
    }
  })
end

hipchatによる通知

defaults/hipchat.rbAPIキーと通知するRoomを指定する。

default['monitor']['hipchat']['apikey'] = ENV['HIPCHAT_API_KEY']
default['monitor']['hipchat']['room'] = 'sensu room'

hipchatのAPIキーをgitで管理するのは微妙だと思ったので、 あらかじめ環境変数に設定し、そこから取得するようにした。

ただ、knifeを実行する際に、sudo のオプションをつけないと、 環境変数が引き継げないので、そこは注意する。
(ただこのやり方だと、オプションを付け忘れた場合にブランクで上書きされるので、 ちゃんとするなら、consulなどを使った方がよいのかも?)

次にメールと同様に、hipchatを行う処理をrecipes/server.rb に以下を追記する。

execute 'install gem hipchat' do
  command "/opt/sensu/embedded/bin/gem install hipchat"
end

sensu_handler "hipchat" do
  type "pipe"
  command "hipchat.rb"
  severities ["ok", "critical"]
end

sensu_snippet 'hipchat' do
  content(
      :apikey => node['monitor']['hipchat']['apikey'],
      :room   => node['monitor']['hipchat']['room']
  )
end