ども、 cloudpackかっぱ (@inokara) です。

sensu-client のちょっとした小技

シェルスクリプトの実行結果をハンドリングしたいけどメールでは飛ばしたくない時にシェルスクリプトを実行するホストで sensu-client が動いていたら超ラッキー!!。sensu-client は localhost の UDP/3030 で Listen しているので以下のようなスクリプトで結果を書き込んで上げればよしなにアラートを上げてくれる。

#!/bin/bash

result=`foo`
if [ $? = 0 ];then
  echo "ok"
  echo '{ "name": "cron_result", "output": "ok", "status": 0 }' > /dev/tcp/localhost/3030
else
  echo "ng"
  echo '{ "name": "cron_result", "output": "failure", "status": 2 }' > /dev/tcp/localhost/3030
fi

以下のようにアラートとして Uchiwa 上で確認出来た。
sensu でシェルスクリプトの実行結果をハンドリングする: Uchiwa で動作確認
尚、sensu check の設定は以下のように何もしない command を定義しておいて interval は長目にしておくとイイかも。

(snip)

  "checks": {
    "cron_result": {
      "command": "",
      "subscribers": [
        "test"
      ],
      "interval": 3600
    }
  },

(snip)

ちなみに…

Ruby からだと以下のように書けば良さそう。

def sensu_client_socket(msg)
  u = UDPSocket.new
  u.send(msg + "n", 0, '127.0.0.1', 3030)
end

def send_ok(msg)
  d = { 'name' => config[:check_name], 'status' => 0, 'output' => 'OK: ' + msg, 'handler' => 'default' }
  sensu_client_socket d.to_json
end

def send_critical(msg)
  d = { 'name' => config[:check_name], 'status' => 2, 'output' => 'CRITICAL: ' + msg, 'handler' => 'default' }
  sensu_client_socket d.to_json
end

def foo
  code, message = res.status
  if code == "200"
    send_ok(msg)
  else
    send_critical(msg)
  end
end

ふむふむ。

参考

ポイントは…

  • sensu-client が起動していれば UDP/3030 で Listen している
  • 結果を JSON で 3030 に書き込めば sensu-server に通知を飛ばすことが出来る

ということで…

もちろん、cron で実行するシェルにも仕込むことが出来るので cron の結果通知にも使えると思う。

元記事はこちらです。
sensu でシェルスクリプトの実行結果をハンドリングするメモ