Observiumでサーバ監視

Observium 1

サーバの監視を行う為の監視ツール。
これまでオープンソースの監視ツールを幾つか使ってみたが、イマイチ気に入らない。Cactiは簡単だけど基本的にはグラフだけだし、Zabbixはそれを動かすだけで負荷高めなので専用にサーバ1台必要という雰囲気だし、簡単に設定できるようで意外と苦労多くそれ以前に各監視対象を見て周るのが大変。トップページ見りゃいいだろってことですかね。監視ツールとしてはBigBrotherのようなアホみたいな解りやすさが欲しいかなと思う。記憶が飛んだらもう二度と設定できませんみたいな面倒なのも嫌だし。専用エージェントを監視対象ホストに仕込むのも好きじゃない。SNMPとIPMI程度が取得できればそれで良いのですが・・アプリの稼働状況は監視しないのかよというツッコミは無しで。

で、監視ツール難民を続けること10年以上。ちょっと面白そうなObserviumというのを見つけたので入れてみました。

Linux & Apacheなら公式ウェブサイトの手順通りにすれば問題なし。FreeBSD ならPortsで少し古いバージョンを入れることができます。最新版を拾うようになっているようです(2016年2月現在)。今回はFreeBSDで最新のObserviumを拾ってきてportsでインストールしてPHP7&Nginxで動かします。ObserviumをNginxで動かすのに苦労してる人が多いようなのでその部分だけはもしかするとFreeBSD以外の人にも参考になるかも。

Observiumの取得

FreeBSDの場合は先に一旦portsのobserviumを入れるとobserviumが必要とするものを一通り揃えられます。その後にobserviumだけをpkg deleteなどで削除するというのが簡単で良いかと。2016年2月現在はportsで最新版を拾って入れてくれます。

2016年2月23日追記

PHP7環境の場合はportsでそのままインストールしようとしてもPHP7には旧来のMySQLモジュールが無いのでコケます。

/usr/ports/net-mgmt/observium/Makefile

#USE_PHP=       ctype filter gd iconv json mcrypt mysql mysqli posix session snmp tokenizer xml zlib
USE_PHP=        ctype filter gd iconv json mcrypt mysqli posix session snmp tokenizer xml zlib
#IGNORE_WITH_PHP=       70

USE_PHP=の行からmysqlを消します(mysqliは残す)。特定バージョンを無視する指定のIGNORE_WITH_PHPの行の頭にコメントの#を付ける。
そのうちにMakefileの修正の必要なくPHP7でもインストールできるようになると思いますが今は編集必要。
Observium側も既にMySQLi対応が進んでいて現在のバージョンではMySQLiで動きます。

portsでのインストール

# cd /usr/ports/net-mgmt/observium
# make install

追記ここまで

==== portsで入れるならここから不要======

observiumの最新版をダウンロードして解凍します。

$ fetch http://www.observium.org/observium-community-latest.tar.gz
$ tar zxvf observium-community-latest.tar.gz

FreeBSD以外の人はfetchではなくwgetなどで

解凍されたobserviumというディレクトリを/usr/local/www/下辺りに移動する。

# mv observium /usr/local/www/
# mkdir /usr/local/www/observium/logs
# mkdir /usr/local/www/observium/rrd
# chown www:www /usr/local/www/observium

4行目のユーザー名(とグループ名)は自分のシステムのnginx用のそれに合わせて下さい。

Observiumのファイル修正

ObserviumはそのままではFreeBSDに合わない部分があるので修正します。最初に変更しなければならないのは僅かです。

/usr/local/www/observium/includes/defaults.inc.php

// 36行目辺りから
$config['rrdtool']        = "/usr/local/bin/rrdtool";
$config['fping']          = "/usr/local/sbin/fping";
$config['fping6']         = "/usr/local/sbin/fping6";
$config['snmpwalk']       = "/usr/local/bin/snmpwalk";
$config['snmpget']        = "/usr/local/bin/snmpget";
$config['snmpbulkget']    = "/usr/local/bin/snmpbulkget";
$config['snmpbulkwalk']   = "/usr/local/bin/snmpbulkwalk";
$config['snmptranslate']  = "/usr/local/bin/snmptranslate";
$config['whois']          = "/usr/bin/whois";
$config['mtr']            = "/usr/local/sbin/mtr";
$config['nmap']           = "/usr/local/bin/nmap";
$config['nagios_plugins'] = "/usr/local/libexec/nagios";
$config['ipmitool']       = "/usr/local/bin/ipmitool";
$config['virsh']          = "/usr/local/bin/virsh";
$config['dot']            = "/usr/local/bin/dot";
$config['unflatten']      = "/usr/local/bin/unflatten";
$config['neato']          = "/usr/local/bin/neato";
$config['sfdp']           = "/usr/local/bin/sfdp";
$config['wmic']           = "/usr/local/bin/wmic";
$config['file']           = "/usr/bin/file";

36行目辺りからのpathはpkg/portsでインストールしていると大抵は/usr/local/bin下辺りなので適切に設定します。svnとgitはインストールして無くても(設定ファイルは未変更で)大丈夫かと思います。

/usr/local/www/observium/poller.php 1行目

#!/usr/local/bin/php

/usr/local/www/observium/poller-wrapper.pyも同様にpythonのpathに修正。(phpではない)

/usr/local/www/observium/snmp.conf (snmp.conf.exampleを参考に)

mibdirs +/usr/local/www/observium/mibs

==== portsで入れるならここまで不要======

/usr/local/www/observium/config.php (config.php.exampleを参考に)

// Database config ---  This MUST be configured
$config['db_extension'] = 'mysqli';   
$config['db_host'] = 'DBのホスト名';
$config['db_user'] = 'DBのユーザー名';
$config['db_pass'] = 'DBユーザーのパスワード';
$config['db_name'] = 'observium用DB名';

// Base directory
$config['install_dir'] = "/usr/local/www/observium"; #要らないっぽい

// Authentication Model
$config['auth_mechanism'] = "mysql";
//その下のアラート通知設定も必要に応じて変更

重要なのは2行目と12行目。特にphp7で動かすなら2行目はmysqliに、12行目はmysqlなので注意。

MySQLの設定

以下の任意の項目は上で作ったconfig.phpの設定と違ってはいけません。

DB名をobserviumとします(任意)。
DBユーザー名をobserviumuserとします(任意)。
DBユーザーのパスワードをsecret!secretとします。(任意)。
my.cnfで標準文字コードをUTF8にしているものとします。

# mysqladmin -uroot -p管理者パスワード create observium
# mysql -uroot -p 管理者パスワード mysql
mysql> grant all privileges on observium.* to observiumuser@localhost identified by 'secret!secret';
mysql> flush privileges;

# cd /usr/local/www/observium 
# /usr/local/bin/php includes/update/update.php

2016年5月21日追記: 変わったみたい。

# cd /usr/local/www/observium
# ./discovery.php -u

データベースにいろいろ作られます。

/usr/local/www/observium/includes/defaults.inc.php

// 420行目辺り
#$config['bad_if_regexp'][] = "/^ng[0-9]+$/";

420行目辺りは表示しないデバイス・インターフェースなどの設定になっていてFreeBSDならmpd5でルーターやらVPNやらやってるならng*は見たいと思うので行頭に#なり//を付けます。他にも自分の監視対象に合わせて確認しておいた方が良いです。

っていうか、defaults.inc.phpのデフォルト値に対して変更があるものだけをconfig.phpに書く(オーバーライド)ってのが正しい設定方法じゃないかと思うんだけど、このbad_if_regexpの行みたいなのがデフォルト設定側にあるとデフォルト設定ファイルを編集しなきゃならないんだけど、何か勘違いしてるかしら?

Nginxの設定

server {
        listen 80; #IPアドレス1つだけなら   これと次行のどちらか1つだけ
        listen 192.168.0.10:80; #複数IPアドレスあってLANからだけ見たいならこんな感じ
        server_name observium.example.localnet;

        root /usr/local/www/observium/html;
        index index.php;

        access_log /var/log/observium.access.log;
        error_log  /var/log/observium.error.log notice;

        location / {
                try_files $uri $uri/ @observium;
        }

        location @observium {
                rewrite ^(.+)$ /index.php/$1/ last;
        }

        location ~ ^/(.*\.php).*$ {
                fastcgi_split_path_info ^(.*\.php)(.*)$;
                fastcgi_pass unix:/var/run/php-fpm.sock;
                fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include fastcgi_params;
        }

        location ~ \.(jpeg|jpg|gif|png|css|js|ico|woff) {
                log_not_found off;
                access_log off;
        }
}

肝は20行目、.phpで終わるURLではなく、.phpを含むURL全てをphpとみなすということにしてやらないとトップページ以外のページリンクがほぼ全て使えません。

Observium使用開始

先ずは(管理者)ユーザーを作成しないとウェブ管理画面にログインできないので注意。

# cd /usr/local/www/observium
# ./adduser.php 管理者ID 管理者パスワード 10

最後の10というのが管理者のレベル。他のIDも同様に作成できるけど大抵はウェブの管理画面から作成するのでここでは終わり。

ここでSNMPの監視対象デバイスを登録したいなら

# cd /usr/local/www/observium
# ./add_device.php 監視対象ホスト名 SNMPコミュニティ名 v2c

最後のv2cはSNMPのプロトコルバージョン。v1, v2c ,v3から選択。(v3の場合はオプション指定自体が違うけど)

もちろん、ウェブの管理画面からデバイス登録はできます。

最初のディスカバリとポーリングを行います。エラーが出ないか見ておきます。

# cd /usr/local/www/observium
# ./discovery.php -h all
# ./poller.php -h all

問題なさそうであれば定時実行の為に/etc/crontabに登録します。

/etc/crontab

40   23   *    *    *    www  cd /usr/local/www/observium && /usr/local/bin/php discovery.php -h all
*/30 *    *    *    *    www  cd /usr/local/www/observium && /usr/local/bin/php discovery.php -h new
*/5  *    *    *    *    www  cd /usr/local/www/observium && /usr/local/bin/php poller.php -h all

取り敢えず終わり

デバイス追加の際に存在確認用にfpingを使っているのですが、fpingは自ホストに送れないのでobserviumが動いているホストの情報が取れないのですが、どうやって解決するのでしょう。

2016年2月追記:デバイス追加画面にSkip Pingの項目が追加されたのでここにチェックを付けるとObserviumを動かしているホストを追加することができるようになりました。

スクリーンショット

Observium 2
単デバイスのメイン画面。グラフにマウスを合わせるとすぐに詳細グラフが出てくる気の利いたインターフェース。

Observium 3
もちろん大きなグラフも表示できる。ウィンドウサイズに合わせてサイズ調整されます。

Observium 4
デバイス関係なくCPUだけ見たいとなればコア別にダーッと一列で表示。バーグラフをクリックすると詳細グラフが表示される。

Observium 5
こんな感じ。グラフの海で眠れそう。

Observium 6
こちらはメモリの一覧。ちょっと鮮やか。

Observium 7
メモリは内訳も表示される。このあたりは当たり前ですね。

Observium 8
デバイスの登録画面。SNMPで情報を吐かない機器を登録するにはどうすればよいのでしょうか。まだObserviumに慣れていないので解かっていません。

Observium 9
いろいろ出せるのは良いけど選ぶの結構面倒いかも。

グラフのエクスポート

Cactiはグラフのエクスポートの補助機能が付いていて便利でしたがObserviumには付いていません。
グラフ画像のURLを単純に外部から取得しようとするとNo Authと書かれた空のグラフが取れてしまいます。
認証無しで画像を取れるようにするには以下。

config.php
$config['allow_unauth_graphs'] = 1;      
$config['allow_unauth_graphs_cidr'] = array('127.0.0.1/32', '192.168.0.0/24');

ローカルからと192.168.0.0/24からの認証無しアクセスを許可

グラフのURLはhttp://example.com/graph.php?type=tttttt&to=xxxxxxxxxx&id=ss&from=yyyyyyyyyy&height=hhh&width=wwwのような形式で、xxxxxxxxxx, yyyyyyyyの部分はUNIX時間で指定すれば良いので扱いやすいです。