だるろぐ

だるいぶろぐです

perlbrew と CloudForecast を動かす

  • 環境
% cat /etc/redhat-release
CentOS release 6.3 (Final)

vim zsh screen あたりは入れておく。

perlbrew

まずは拾ってくる。

curl -kL http://install.perlbrew.pl | bash

そして使うためのファイルを読む設定。確か上記の作業後に指示された気がする。

echo " source ~/perl5/perlbrew/etc/bashrc " >> .zshrc_local

ときにこの場合、 .zshrc にはこう書いてある。

load_if_exists () {
    if [ -e $1 ]; then
        source $1
    fi
}

load_if_exists "$HOME/.zshrc_local"

普通に .bashrc / .zshrc に追記してもいい。


いったんシェルを抜けるなり、 source ~/perl5/perlbrew/etc/bashrc するなり。


無駄に最新版を入れる。

perlbrew install perl-5.16.2
perlbrew switch perl-5.16.2
perlbrew install-cpanm
perl -le "warn $]"
5.016002 at -e line 1.

daemontools

使うので。以下参考。
http://www.ftnk.jp/~fumi/cl/2010-04-19-2.html


コマンドは /command/ 以下にインストールされるので、自分のパス通ってるところに ln -s でもする。

memcached

使うよね。

wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz
tar zxf memcached-1.4.15.tar.gz
cd memcached-1.4.15
sudo yum install libevent-devel
./configure --prefix=/usr/local/memcached
sudo make install

あとは適当に run ファイル書いて daemontools に任せる。

mysql

rpm を拾ってくるなど。
もうこれサーバ構築ですね。
http://dev.mysql.com/downloads/mysql/#downloads


この辺入れる。

MySQL-client-5.5.28-1.rhel5.x86_64.rpm
MySQL-devel-5.5.28-1.rhel5.x86_64.rpm
MySQL-server-5.5.28-1.rhel5.x86_64.rpm
MySQL-shared-5.5.28-1.rhel5.x86_64.rpm
MySQL-shared-compat-5.5.28-1.rhel5.x86_64.rpm


あと apache とか iptables とか色々と。

CloudForecast(準備)

本題。
拾ってくる。

git clone git://github.com/kazeburo/cloudforecast.git

依存ライブラリとか。以下参考。
http://memememomo.hatenablog.com/entry/20100726/1280124818
http://blog.riywo.com/2011/02/27/043646

あとこれ入れると多分いい。

cpanm Module::Install
cpanm Alien::RRDtool

依存perlモジュールは extlib に入れる想定みたいだけど、別に perlbrew 入れてるから構わず入れる。

cpanm --installdeps .

もう一度perlbrew

net-snmp 辺りを入れようとすると多分エラー吐く。
ググると、どうも perlbrew 入れるときに perlコンパイルオプション指定しないと駄目らしい。
泣きながら再インストール。

perlbrew uninstall perl-5.16.2
perlbrew install perl-5.16.2 -A ccflags=-fPIC

perl本体は削除され、再インストールされるけど、モジュールは削除されずに使いまわされたような気がする。いいのか?


改めて yum で net-snmp 辺りを入れる。当然インストールされるファイルの所有者が root になるので

cd ~/perl5/perlbrew/perls/perl-5.16.2/lib/site_perl/5.16.2/
sudo chown -R hirafoo:hirafoo *

する。そして先ほどのサイト見つつ snmp の何かをやるとか。

CloudForecast(起動)

yaml を用意する。

cp cloudforecast_sample.yaml cloudforecast.yaml
cp host_config/basic.yaml{,_org}

見たいの追加する。

--- a/host_config/basic.yaml
+++ b/host_config/basic.yaml
@@ -6,4 +6,9 @@
 component_config:
 resources:
   - traffic:eth0
+  - traffic:2:eth0
   - basic
+  - http:80
+  - memcached:11211
+  - mysql
+  - innodb

ディレクトリ作る。

mkdir data

daemontools で動かす前に、 daemontools でやるのと同等のコマンドを打つ。

root_path=/usr/local/cloudforecast
sudo /usr/local/bin/setuidgid hirafoo $root_path/cloudforecast_radar -c $root_path/cloudforecast.yaml -l $root_path/server_list.yaml

すると Can't locate local/lib.pm... とか怒られますね。


何でかってと

% head -n 1 /usr/local/cloudforecast/cloudforecast_radar
#!/usr/bin/env perl

このように cloudforecast_radar で /usr/bin/env perl を指定してるんですが、これ実際何が使われるかというとユーザによって変わるわけで。 perlbrew で入れた perl はそのアカウントでしか(普通)使えないわけで。つまり

% cat print_version.pl
#!/usr/bin/env perl
use strict;
use warnings;

print "$^V\n";

% chmod +x print_version.pl

% ./print_version.pl
v5.16.2

% sudo ./print_version.pl
v5.10.1

のように他ユーザで env perl すると perlbrew じゃない perl = システムの perl が使われるわけで。
だから run の中とかで

_perlhome="/home/hirafoo/perl5"

export PATH=$_perlhome/perlbrew/perls/perl-5.16.2/bin:/usr/local/bin:/usr/bin:/bin

とか書いてやる。あくまで一例。他にも色々やりようはある。


さーてこれで radar は動いたし、 web から見るかーと思うと

Odd number of elements in anonymous hash at /usr/local/cloudforecast/lib/CloudForecast/Host.pm line 19

とか言われます。該当部分を見ると

 12 sub list_graph {
 13     my $self = shift;
 14     my @ret;
 15     my $resources = $self->resources;
 16     for my $resource ( @$resources ) {
 17         my $data = $self->load_resource($resource);
 18         my @graphs = $data->list_graph;
 19         push @ret, {
 20             graph_title => $data->graph_title,
 21             resource_class => $data->resource_class,
 22             resource => $resource,
 23             graphs => \@graphs,
 24             sysinfo => $data->graph_sysinfo,
 25             last_error => $data->last_error,
 26         };
 27     }
 28     return @ret;
 29 }

とあるので、この @ret に突っ込んでる内容をダンプしてみると $data->last_error が undef だそうなので

-            last_error => $data->last_error,
+            last_error => $data->last_error || "",

とでもしてしまいます。

終わり

ここまで終えて、別にサーバで負荷かかるようなこと一切してないからグラフ見てもつまらないなーそもそもモニタリングする必要があるのって負荷かかってるサーバなんじゃ…そもそもこのサーバ何のために手に入れたの…とかは考えると落ち込むのでさっさと忘れてしまう。