muninがssh経由で動かない

まだ新しいさくらのVPSへの移行が終わっていない。今回はChef Soloで全部セットアップしてやろうとしていたがサーバ監視で使っているmuninが動かない。

Chefでセットアップして、とりあえずVagrant環境をmuninマスターにして新しいさくらのVPSで動かしたmuninノードを監視しようとしてみた。しかしデータが全く取れない。 [FATAL] Socket read from xxx failed.というようなエラーが出ている。

設定としては以下のようにssh経由で接続しようとしてるけど動かない。

[host.example.com]
  address ssh://host.example.com/bin/nc 127.0.0.1 4949
  use_node_name yes

ノード側の auth.log を見るとマスターからのmuninユーザでのsshの接続は成功している、10秒くらい接続してユーザ側(マスター側)から切断されている。

次にノード側の munin-node.log を見ると何も残っていない。つまり、sshまでは接続できているがそこからNetcat経由でmunin-nodeに届いていない感じ。

しかし、マスターからmuninユーザで、

ssh host.example.com /bin/nc 127.0.0.1 4949

と打つとmunin-nodeにつながるし、fetch cpuと打てばデータは取れる。でもmuninのプログラムからは失敗する。

回答がないが以下の人と同じ状況だ。

Setup munin-node with native ssh
http://nerdanswer.com/answer.php?q=13482

そもそも現行サーバの設定を比べようかと思ったら、現行サーバでも取得できていない!!!年間グラフをみると昨年12月くらいからデータがとれなくなっている。

muninのバージョンは2.0.6。少し古く何かバグがあるかもしれないのでwheezy-backportsを使って2.0.19まで上げてみようかと思っている。

そして現行サーバのmunin-nodeで使っているプラグイン見てたらpostfixもセットアップする必要があることに気がついた。またChefのレシピを書かないといけない。もうGWだというのに。

Raspberry Pi+Ruby+muninで温度ロガー

以前のエントリ

はこのためにあった。

前回HIH-6130 デジタル温度センサから湿度と温度を取得するプログラムをRubyで書いた。これをmuninのプラグインに変更し、グラフを作成してみる。

というわけでHIH-6130用muninプラグイン作りました。
https://github.com/makotokw/munin-temperature

muninプラグイン

初めて作ったので調べてみた。基本的に本家のドキュメントでなんとかなる。

http://munin-monitoring.org/wiki/HowToWritePlugins
http://munin-monitoring.org/wiki/protocol-config

muninはプラグインの実体を /usr/share/munin/plugins などに置き、有効にするものを /etc/munin/plugins/ へシンボリックリンクするというのがお作法のようだ。

プラグインはそれぞれ単体で動作する実行形式のスクリプトになっている。仕様はとてもシンプルで config を引数に受けた時にどのようなデータに対応しているかを出力し、何も引数がなければデータを出力する。

今回つくったプラグインは以下のようなconfigを出力する。設定できるのはグラフの単位やラベルの他に、通知用に警告するために閾値を設定できる。完全に自分用に設定しているが部屋を30度を超えたら警告、40度を超えたら重大な警告。湿度はそれぞれ60%と50%になっている。調べたら湿度は60%以上に保つのがよいらしい。

graph_title Temperature / Humidity
graph_args --base 1000 -l 0 -u 100
graph_category Room
graph_info This graph shows temperature and humidity by HIH6130 Sensor
graph_vlabel Temp(C) / Humid(%)
temperature.label temperature
temperature.warning 30
temperature.critical 40
humidity.label humidity
humidity.warning 60:
humidity.critical 50:

このあたりの出力を行うのすら楽をしたかったのでRubyGemsより munin を使用した。

インストール方法

Rasbianに入るのがruby 1.9.3だったので1.9.3用にしてる。Rubyで書いたからrakeでインストールするようにした。Rasbpery Pi上で以下を実行すると munin-temperature/bin/temperature-hih6130 を直接 /etc/munin/plugins/temperature-hih6130 にシンボリックリンクする。(お作法無視)

git clone https://github.com/makotokw/munin-temperature.git
cd munin-temperature
sudo gem i bundler
bundle install
sudo rake install

/etc/munin/plugins/temperature-hih6130 にファイルができていたら成功。i2cコマンドが実行できるユーザで実行してみてください。なおシンボリックリンクしてるのでgitで取得したファイルは消さないでください。

muninユーザの設定

ここで嵌ったのだけど、i2cコマンドを実行する権限がユーザにいる。muninユーザで実行していると思ったんだけどうまくいかなかったのでいろいろ試行錯誤した結果 /etc/munin/plugin-conf.d/munin-node に以下を追記してrootで動かすことにした。

[temperature-hih6130]
user root

一応rootをi2cグループに入れておく。

sudo adduser root i2c

うまく動くとこんな感じです。

munin-pluign-temperature.png

最近加湿器をオンにした。温度は20度前後をうろちょろ、20度あれば全然快適なはずなんだけど絶望的に足元が寒い。早く一年分のデータを取りたい。

Raspberry Piでサーバリソースを監視する

Raspberry Piでいろいろなリソースの推移をチェックする監視サーバを構築することにした。セットアップおよび独自データのグラフの作成が簡単そうに見えたのでmuninを使うことにした。

munin

muninのインストール

サーバとしてデータを集めてグラフつくる munin パッケージと、クライアントとしてデータをサーバに送信する munin-node の2つにわかれている。自分マシンのデータを自分で表示する場合は両方インストールする。

RaspberryPi
sudo apt-get install munin munin-node

監視されるだけのサーバは munin-node だけをインストールする。

sudo apt-get install munin-node

muninのバージョンは 2.0.6 だった。

muninのグラフの表示

muninではcronで定期的(デフォルトは5分毎)にスクリプトが実行されグラフデータは静的なhtmlページとして出力する(またはCGIをつかって動的に生成する)。munin自体はそれを配信する機能を提供していなかった。

そのためウェブサーバで出力されるディレクトリを公開する。他の人に見られて困る場合は自分でウェブサーバの設定をつかってアクセス制限や認証機能を使う必要もある。

debian系のパッケージでは出力先は設定ファイル /etc/munin/munin.conf を見ればわかり、 /var/cache/munin/www になっていた。

サーバはNginxを使っているので以下のようなalias設定を追加した。

    location /munin/ {
        alias /var/cache/munin/www/;
    }

Apacheなら alias /munin/ /var/cache/munin/www/ とかだろう。

複数台の管理

以下のように自宅の他のRaspberry PiとさくらのVPSを監視対象にしてみた。/etc/munin/munin.conf を変更。外部サーバはsshで接続することにした。

#[localhost.localdomain]
#    address 127.0.0.1
#    use_node_name yes

[home;rpi01]
  address 192.168.1.37
  use_node_name yes

[home;rpi02]
  address 127.0.0.1
  use_node_name yes

[global;sakuravps]
  address ssh://{{さくらのVPSのIPアドレス}}/bin/nc localhost 4949
  use_node_name yes

さくらVPSのサーバをセットアップ

さくらVPS・・・というかLAN外にあるDebianサーバを監視する話。サーバにログインし、munin-nodeだけインストール。

# VPS
sudo apt-get install munin-node

sshでデータを送信する

マスターからノードに接続する方向になる。事前にマスターであるRaspberry Pi側でmuninユーザの鍵を作成する。root権限になってから以下を実行する。

# Raspberry Pi
sudo -u munin ssh-keygen -t rsa

質問をすべて空リターンしていくと /var/lib/munin/.ssh/id_rsa.pubに公開鍵が作成される。

中身をコピーして、さくらVPSのマシンのログインしてauthorized_keysを作成して貼り付ける。root権限になってから以下を実行。

# VPS
chsh -s /bin/bash munin
su - munin
mkdir -p /var/lib/munin/.ssh
vi /var/lib/munin/.ssh/authorized_keys
chmod 700 /var/lib/munin/.ssh
chmod 600 /var/lib/munin/.ssh/authorized_keys

ノードのsshの設定でユーザを制限している場合は /etc/ssh/sshd_configAllowUsers に munin を追加してsshを再起動しておく。

うまく行けばマスターであるRaspberry Piから sudo -u munin ssh munin@さくらVPSのIP でログインできる。

グラフ作成の負荷を下げる

3台監視したらRaspberry Piのロードアベレージが10を超えたので対処した。muninの更新は5分起きで実行されるが5分で書き終わらないくらい遅いので24時間グラフを書き続けているというヤバイ状態になった。

通常のサーバでも何10台と監視すると負荷問題が発生するのでこの手の情報は検索するといろいろ見つかった。デフォルトでmunin-nodeをインストールすると20個ぐらいグラフがあって、日、週、月、年と期間でx4になり、それがxサーバとなるわけなので膨大な数のグラフを更新することになってしまう。対処方法としてはいくつかある。

  • グラフを減らす → 微々たるものだった
  • 動的に表示する → 静的作成で5分掛かってる = 動的に表示してもページによっては数分待たされるだろうから却下
  • グラフを更新する頻度を減らす → 採用

最終的に /etc/cron.d/munin を以下のように変更した。

#*/5 * * * *     munin if [ -x /usr/bin/munin-cron ]; then /usr/bin/munin-cron; fi
0 0,12 * * *     munin if [ -x /usr/bin/munin-cron ]; then /usr/bin/munin-cron; fi
0 1-11,13-23 * * *     munin if [ -x /usr/share/munin/munin-update ]; then /usr/share/munin/munin-update; fi
5-55/5 * * * *     munin if [ -x /usr/share/munin/munin-update ]; then /usr/share/munin/munin-update; fi

別にリアルタイムでチェックしないので1日2回、0時と12時にグラフを更新し、それいがはデータだけ更新するという設定。

課題

グラフの作成がエラーになっていることがあってよくわからない。

困ったとき使ったもの

Raspberry Piに温度センサーを繋いでRubyで取得してみた

なぜかRaspberry Piが3台ある。1台は電子工作用、1台は自鯖置き換え用、もう1台はちょっとしたWebサービス動かす用。どれも並行して進めていてなんかブログ書くタイミング逃している。

そんな中、温度センサーを使ってみる編が進んだの書くことにした。

購入したのは HIH-6130 デジタル温度センサスイッチサイエンスさんで購入した。USBで取る方が簡単かもしれないけど、電子工作してみたかったのでこれにした。

基本的に HIH-6130 湿度センサー を使う の記事を大変参考にさせていただいた。

プロトタイプは同じくスイッチサイエンスさんで購入したAdafruit Raspberryにブレッドボードを乗せてやっていた。

Raspberry Pi

i2c関連のセットアップ

OSはRaspbian。

sudo apt-get install i2c-tools
sudo adduser pi i2c
sudo shutdown -r now
sudo modprobe i2c-bcm2708
sudo modprobe i2c-dev
sudo vi /etc/modules

で以下を追加する

i2c-bcm2708
i2c-dev
sudo vi /etc/modprobe.d/raspi-blacklist.conf 

で i2c-bcm2708 の行をコメントアウト

# blacklist spi and i2c by default (many users don't need them)

blacklist spi-bcm2708
# blacklist i2c-bcm2708
sudo i2cdetect -y 1
sudo i2cdump -y 1 0x27

でデータが取れればok。

Rubyでi2c

参考: Raspberry Pi View topic – Use I2C with Ruby

この i2c ライブラリを使うことにした。

$ sudo apt-get install ruby1.9.1 ruby1.9.1-dev
$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [arm-linux-eabihf]

ややこしいがruby1.9は1.9系のインストールだけど、たしかこのパッケージに問題があってruby1.9.1が作られたのでAPTのruby1.9.1でインストールされるのは1.9系の現行バージョン1.9.3になる(1.9.1が入るわけではない)。この時点では2.0系のパッケージはなかった。

ちなみにrbenvなどでやるとビルドにすごい時間がかかるそうなのでAPTのパッケージで我慢する。

sudo gem install i2c
#!/usr/bin/env ruby

require 'rubygems'
require 'i2c'

class HIH6130

  def initialize(path, address = 0x27)
    @device = I2C.create(path)
    @address = address
  end

  def fetch_humidity_temperature
    s = @device.read(@address, 0x04)
    hum_h, hum_l, temp_h, temp_l = s.bytes.to_a

    status = (hum_h >> 6) & 0x03
    hum_h = hum_h & 0x3f
    hum = (hum_h << 8) | hum_l
    temp = ((temp_h << 8) | temp_l) / 4

    return status, hum * 6.10e-3, temp * 1.007e-2 - 40.0
  end

end

sensor = HIH6130.new('/dev/i2c-1')

10.times do
  p sensor.fetch_humidity_temperature
  sleep(1)
end

このプログラムはスイッチサイエンスさんのリンクにあったサンプルスケッチをそのまま移植した。

最初、Adafruitの上に置いたブレッドボードで動かしたら33度と出力されて計算間違っているのかな?と思ったら普通にRaspberry Piの熱が伝わっている感じだったので離してみたら5度下がった。部屋の温度計と大体同じになったのでちゃんと動いているっぽい。部屋の温度が高いのはいろんなデバイスが熱風を発しているため。

センサーを離さないといけないと分かったので最終的にどのような形態にするのかも考えなきゃいけないなぁ。

とりあえず次はこれをmuninのプラグインに書きなおして、グラフ化する予定。最終目標は赤外線信号を発信して、自動でエアコンつけたり消したりすること。