ども、 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 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
ふむふむ。
参考
- Documentation / 0.16 / Inputting External Results to the Local Socket
- joemiller / pantheon-check-ping-endpionts.rb
ポイントは…
- sensu-client が起動していれば UDP/3030 で Listen している
- 結果を JSON で 3030 に書き込めば sensu-server に通知を飛ばすことが出来る
ということで…
もちろん、cron
で実行するシェルにも仕込むことが出来るので cron
の結果通知にも使えると思う。
元記事はこちらです。
「sensu でシェルスクリプトの実行結果をハンドリングするメモ」