LibreNMSでサーバー監視

以前にサーバー監視ツールのObserviumの記事を書いた。Observiumは有料版のProffessionalと無料のCommunityの2種類があって、おとなしく使うだけなら無料でいけるけどアラートを通知したいとかもう少し機能が欲しいとなると1年に£200 (約3万円)払うことになる。ちょっと高い。
LibreNMSはObserviumのCommunityからフォークしたもので現在は無料版のみ。今回はそのLibreNMSをFreeBSDにインストール。

インストール

FreeBSDの場合はpkg/portsでインストールすると必要なパッケージ/portsがインストールされるので簡単。
ただし、肝心のLibreNMSがかなり古め。しかもportsは結構やっつけ感あり。そこで一度インストールしてからLibreNMSだけをアンインストールする。LibreNMSに必要なパッケージ/portsは残る。
その後に最新版のLibreNMSをインストールする。

LibreNMSの仮インストール
# pkg install net-mgmt/librenms
または
# cd /usr/ports/net-mgmt/librenms
# make install
LibreNMS削除
# pkg delete net-mgmt/librenms
MySQLの準備
# mysql -u root -p mysql
mysql> CREATE DATABASE librenms CHARACTER SET utf8 COLLATE utf8_unicode_ci;
mysql> CREATE USER 'librenms'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON librenms.* TO 'librenms'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> exit
/usr/local/etc/my.cnf (挿入)
1
2
[mysqld]
sql-mode=""   #←1行追加

MySQLサーバ再起動
# service mysql-server restart

Nginxの準備
今回はウェブサーバにNginxを利用することにした。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
    listen      80;
    server_name librenms.example.com;
    root        /usr/local/www/librenms/html;
    index       index.php;
    access_log  /usr/local/www/librenms/logs/access_log;
    error_log   /usr/local/www/librenms/logs/error_log;
    charset     utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location /api/v0 {
        try_files $uri $uri/ /api_v0.php?$query_string;
    }
    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;
    }
}
ログファイルは/var/log下がFreeBSDの流儀だけどlibreNMSの流儀に倣った。
その他の部分はLibreNMSの公式ドキュメントと少し違うけどこれで良いはず。

Nginxの再起動(設定再読込)
# service  nginx reload
LibreNMSの準備
# cd /usr/local/www
# fetch https://github.com/librenms/librenms/archive/master.zip
# unzip master.zip
# mv librenms-master librenms
# mkdir ./librenms/logs
# mkdir ./librenms/rrd
# chmod 775 ./librenms/rrd
# chown -R www:www librenms
/usr/local/www/librenms/config.php.default (変更)
$config['user'] = 'www';
他は変更しない。

/usr/local/www/librenms/includes/defaults.inc.php (変更)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
// Location of executables
$config['fping']                    = '/usr/local/sbin/fping';
$config['fping6']                   = '/usr/local/sbin/fping6';
$config['fping_options']['retries'] = 3;
$config['fping_options']['timeout'] = 500;
$config['fping_options']['count']   = 3;
$config['fping_options']['millisec'] = 200;
$config['snmpwalk']                  = '/usr/local/bin/snmpwalk';
$config['snmpget']                   = '/usr/local/bin/snmpget';
$config['snmpbulkwalk']              = '/usr/local/bin/snmpbulkwalk';
$config['snmptranslate']             = '/usr/local/bin/snmptranslate';
$config['whois']          = '/usr/bin/whois';
$config['ping']           = '/sbin/ping';
$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['sfdp']           = '/usr/local/bin/sfdp';
/usr/local/www/librenms/includes/process_config.inc.php (変更)
1
2
$config['rrdtool'] = '/usr/local/bin/rrdtool';
$config['rrdtool_version'] = 1.6;
defaults.inc.phpに含めればよい筈だが何故か設定が別れている。
pythonをインストール済みなのにwhich pythonでpythonが無い、which python2でpython2が無いと表示される場合はシンボリックリンクを2つ作成。
例 python2.7の場合:
# ln -s /usr/local/bin/python27 /usr/local/bin/python
# ln -s /usr/local/bin/python27 /usr/local/bin/python2
/usr/local/www/librenms/daily.sh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#150行目付近
    if [[ -z "$arg" ]]; then
#        up=$(php daily.php -f update >&2; echo $?)
#        if [[ "$up" == "0" ]]; then
#            ${DAILY_SCRIPT} no-code-update
#            set_notification update 1  # make sure there are no update notifications if update is disabled
#            exit
#        fi
#
#        # make sure the vendor directory is clean
#        git checkout vendor/ --quiet > /dev/null 2>&1
#
#        update_res=0
#        if [[ "$up" == "1" ]]; then
#            # Update to Master-Branch
#            old_ver=$(git show --pretty="%H" -s HEAD)
#            status_run 'Updating to latest codebase' 'git pull --quiet' 'update'
#            update_res=$?
#            new_ver=$(git show --pretty="%H" -s HEAD)
#        elif [[ "$up" == "3" ]]; then
#            # Update to last Tag
#            old_ver=$(git describe --exact-match --tags $(git log -n1 --pretty='%h'))
#            status_run 'Updating to latest release' 'git fetch --tags && git checkout $(git describe --tags $(git rev-list --tags --max-count=1))' 'update'
#            update_res=$?
#            new_ver=$(git describe --exact-match --tags $(git log -n1 --pretty='%h'))
#        fi
#
#        if (( $update_res > 0 )); then
#            set_notification update 0
#        fi


#215行目付近
                # List all tasks to do after pull in the order of execution
                status_run 'Updating SQL-Schema' 'php includes/sql-schema/update.php'
#                status_run 'Updating submodules' "$DAILY_SCRIPT submodules"
                status_run 'Cleaning up DB' "$DAILY_SCRIPT cleanup"
                status_run 'Fetching notifications' "$DAILY_SCRIPT notifications"
                status_run 'Caching PeeringDB data' "$DAILY_SCRIPT peeringdb"
行頭に#を付けるかその行を削除

ウェブブラウザで初期設定

ブラウザのURL入力欄にLibreNMSが稼働しているホスト名またはIPアドレスを入力。

LibreNMS 1
リストの全ての項目が緑色になっていることを確認して[Next Stage]を押す。

LibreNMS 2
データベースの設定。多くの場合はMySQLのlibrenms用DBへの接続パスワードを入力して[Next Stage]を押す。他は触らなくて良い筈。

LibreNMS 3
しばらく待たされて上の画像のように--Done   Database is up to date!が表示されたら [Goto Add User]を押す。

LibreNMS 4
LibreNMSのウェブサイトに管理者としてログインするためのユーザー名とパスワード(とメールアドレス)を入力して[Add User]を押す。ユーザー名・パスワード共に用意に推測されず十分な長さのものを。ただしユーザー名は絶対に忘れないこと。

LibreNMS 5
この画面は待つ必要なく[Generate Config]を押すだけ。

LibreNMS 6
この画面は待つ必要なく[Finish install]を押すだけ。

LibreNMS 7
赤い警告のようなのが表示されても無視で良い。
薄緑の四角の最後の here to login to your new installのリンクをクリック。

利用開始

LibreNMS 8
初期設定で登録したユーザー名とパスワードを入力して[login]を押す。

LibreNMS 9
一番上の (歯車アイコン)を押すとプルダウンメニューが開くので Global Settings をクリック。

LibreNMS 10
上部のタブから[External Settings]タブを選択し、RRDTool Setupの行をクリックすると展開するのでPath to rrdtool binaryの項目を/usr/local/bin/rrdtoolに変更する。これはFreeBSDの場合。Linuxなら触らなくて良いかも。
これを変更しないとリアルタイム系を除くグラフの表示が行われない。(グラフが表示される筈の部分が欠損表示)
この項目は上の方で編集したdefaults.inc.phpにあるべきもので、別にprocess_config.inc.phpにもあるので、ここで設定するのは変じゃないかな。

LibreNMS 11
トップ画面に戻り左上の(デバイス系)のプルダウンメニューを開く。
Add Deviceでモニター対象のデバイスを追加する。

LibreNMS 12
Hostname欄に対象機器のホスト名またはIPアドレスを入力する。初期値はSNMPのv2になっている。ポートやプロトコルはSNMPの標準になっているので普通は変更する必要は無いかと。
SNMPのCommunity (SNMPのパスワードのようなもの)を入力して[Add Device]を押す。
これで機器のエントリーは完了。(情報収集はまだ行われない)
同様にモニターしたいデバイスを登録していく。

何故かconfig.php.defaultのusersの値が反映されないので変更。
ネットワーク内で利用している共通のSNMP communityがあるなら設定しておく。個別なら変更不要。

/usr/local/www/librenms/config.php (変更)
1
2
$config['user'] = 'www';
$config['snmp']['community'] = array("public");

cronに情報収集用ジョブを登録

/etc/crontab (変更と追加)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
PATH=/etc:/usr/local/bin:/usr/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin  #変更
#以下追加
33  */6 * * *  www  /usr/local/www/librenms/discovery.php -h all > /dev/null 2>&1
*/5 *   * * *  www  /usr/local/www/librenms/discovery.php -h new > /dev/null 2>&1
*/5 *   * * *  www  /usr/local/www/librenms/cronic /usr/local/www/librenms/poller-wrapper.py 16
15  0   * * *  root /usr/local/www/librenms/daily.sh > /dev/null 2>&1
*   *   * * *  www  /usr/local/bin/php /usr/local/www/librenms/alerts.php > /dev/null 2>&1
*/5 *   * * *  www  /usr/local/bin/php /usr/local/www/librenms/poll-billing.php > /dev/null 2>&1
01  *   * * *  www  /usr/local/bin/php /usr/local/www/librenms/billing-calculate.php > /dev/null 2>&1
*/5 *   * * *  www  /usr/local/bin/php /usr/local/www/librenms/check-services.php > /dev/null 2>&1
FreeBSDではこれがオススメ。LibreNMSのサイトにあるcrontabの例とは少し違う。
最初は /usr/local/www/librenms/discovery.php -h all や /usr/local/www/librenms/discovery.php -h new を手動で実行してエラーにならないことを確認する方が良い。その後、念のためにchown -R www:www /usr/local/www/librenms/rrd を実行する。
ポーリングの確認
# /usr/local/www/librenms/validate.php
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
====================================
Component | Version
--------- | -------
LibreNMS  | 
DB Schema | 207
PHP       | 7.0.23
MySQL     | 5.6.37
RRDTool   | 1.6.0
SNMP      | NET-SNMP 5.7.3
====================================

[OK]    Database connection successful
[OK]    Database schema correct

/etc/crontabを編集してから5 or 10分以上待ってから実行すること。
全ての項目で緑のOKが出ること。赤のFailなどが表示されたら設定見直しが必要。

グラフの図そのものが表示されない場合はrrdtoolのpathの設定間違いと思われる。
グラフの枠や背景は表示されるがその中身が表示されない場合はpollingが失敗していると思われる。
/etc/crontabの設定を見直す。またはpollingの関係ファイルの1行目を見直す。

また、意外なところで/etc/crontabのpathの設定忘れがある。LibreNMSではpollingにpythonスクリプトを使うが、/etc/crontabのpathの設定に/usr/local/binを追加しておかないと恐らくスクリプトは動かない。(これ新しいシステムでよく忘れててタスク走らなくてアレ?ってなるやつ)

LibreNMS 13
監視対象デバイス別のオーバービュー画面。すっきり最低限の情報を表示する。

LibreNMS 14
システム系のグラフ表示。左から過去24時間、過去1週間、過去1ヶ月、過去1年となっている。libreNMSを動かし始めてから24時間以内なので一番左のグラフ以外はほぼ真っ白。
上の画像でUsers Logged Inに何も表示されていないのは全くログインしていないから。

LibreNMS 15
ネットワークの遅延に関するグラフ。これはrrdtoolで出力されるグラフではない。

LibreNMS 16
ネットワークトラフィックに関するリアルタイムグラフ。上の画像では2秒毎の更新となっているが、0.25秒,1秒,2秒,5秒,15秒,1分毎の更新を選択できる。グラフの緑・青の折れ線グラフの右端が現在の転送速度を示している。リアルタイムグラフでよく見かけるタイプ。

LibreNMS 17
LibreNMSのiPhone,Android用アプリがあるのでアプリでサーバー監視を行うことも可能。上の画像はAndroid用のmyLibreNMSというアプリ。
アプリを使うにはLibreNMSの設定で「API Settings」から[Create API access token]ボタンでAPIを利用するためのアクセストークンを作成する。(簡単)。アクセストークンはかなり長い文字列だがQRコード表示機能があるのでQRコードを表示してiPhone,Androidのアプリで読み込む(カメラ有りの機種に限る)と入力の手間が省ける。
階層深くて使いにくいと思うので正直iPhoneやAndroidのブラウザで表示する方が良さげ。

Observiumと比べてそんなに違わないようで結構違う。LibreNMSはアラート送信できる(機能する)のが最大の利点かしら。
LibreNMSの方がおもしろそうではあるけどまだ途上感が凄い。ソースコードを見るとLinuxの構成向けの決め打ちが多いように思う。ドキュメントもLinux向けしか無いし。Linux向けと考えても変な部分があるけど今後整備されるのかな。

関連記事: