パトランプでサーバ監視 with Gainer,Ruby

7月 14th, 2008 admin Posted in Gainer, Ruby, 勉強会 | No Comments »

CSNagoyaのLTで「RubyとGainerで行うサーバ監視」というタイトルで発表しました。

概要

サーバがピンチだっていうのにアラートメールが届くだけなんて地味すぎだろ
というコンセプトのもとに、サーバのロードアベレージをチェックし、高いようであればパトランプを点灯させるというものを作ってみました。本来のサーバ監視という意味ではロードアベレージだけチェックするのはいまいちですが、そのあたりは改良していきたいと思います。むしろRubyとGainerだけで、こんなに簡単にできるんだということが伝われば幸いです。

動作している様子

といっても、パトランプが点灯するだけですが。仕事中に突然これが光りだすのはエキサイティングです。

システム概要

all.png
非常に単純ですね。調査もとのマシンから、監視対象サーバにSSHでログインしてロードアベレージをチェックします。その後ロードアベレージが一定の値を超えていたらGainer経由でパトランプを点灯させます。

回路

dsc00243.jpg
パトランプは12Vで動くものです。ネタのためだけに欲しかっただけなのに6000円もして悲しかった。
gainer_map.gif
回路図はこんな感じです。Gainerから出る信号は弱い(多分3Vぐらい?)なので当然パトランプを直接点灯させられません。そこでパトランプにはリレーと12Vの電源をつけてやり、そのリレーのON/OFFをトランジスタによるスイッチで行いました。

コード

たったこれだけのコードでできるというのが驚きです。Gainerとのやり取りはFunnelというソフトを使いました。GainerやArduinoに対応した便利なツールキットのことでIOのフィルタなどをいい感じにやってくれるものです。

RUBY:
  1. require 'rubygems'
  2. require 'net/ssh'
  3. require 'funnel'
  4.  
  5. def get_load_average(str)
  6.   return str.slice(/load average: ([^,]+)/,1).to_f
  7. end
  8.      
  9. module Funnel
  10.     la = 0.0
  11.     Net::SSH.start(ARGV[0], ARGV[1], :password => ARGV[2]) do |ssh|
  12.       la = get_load_average(ssh.exec!('uptime'))
  13.     end
  14.    
  15.     if la> 2
  16.       gio = Gainer.new(Gainer::MODE1)
  17.       gio.aout(0).value = 1
  18.       sleep(300)
  19.     end
  20. end

発表資料

まとめ

今回はGainerとRubyでパトランプを点灯させてみました。Gainerについて興味をもったかたは以前エントリーを書きましたのでそちらをご覧下さい。

また8月に開催されるOSC NAGOYAには開発者の小林茂さんが講演に来てくださいます。
お近くのかたは是非ご参加ください。

Leave a Reply