古い環境を pmmn(A Poor Man’s Munin Node)で監視

古い環境を pmmn(A Poor Man’s Munin Node)で監視 はてなブックマーク - 古い環境を pmmn(A Poor Man’s Munin Node)で監視


Munin でサーバを監視するには、munin-node が必要。けれど、munin-node が入らない場合、pmmn を使う方法があります。pmmn ( A Poor Man’s Munin Node ) は munin-node の代替ツールで、munin-node が動作しない環境からもデータを取得出来ます。そんな、pmmn のセットアップと使い方を紹介します。

■ pmmn は munin-node の手軽な代替ツール

pmmn は munin-node 代替ツールです。Munin 開発者の Steve Schnepp 氏が Github に公開しています。pmmn は、’A Poor Man’s Munin Node‘ の略で、’お手軽な munin-node’ といった意味合いです。その名前の通り、munin-node が多くの CPAN で配付されている Perl モジュールが必要なのに対して、pmmn はモジュールを殆ど必要としません。

pmmn は Perl で記述されていて、常駐デーモンはありませんが、munin-node と同じようにデータを返すことが出来ます。動作は munin-node のエミュレータとして動作し、Munin が使っている LIST や FETCH などのプロトコルを利用可能です。 munin-node は Port 4949 を Listen しながら通信を行います。pmmn は、xinetd 等のスーパーサーバ経由で、必要があれば呼び出され、標準入出力を通し、要求に応じたデータを返します。

  • munin-node … デーモン(常駐)
  • pmmn … 常駐しない(xinetd 経由で動作)

pmmn が向いているのは、OS 環境が古い場合です。最近のディストリビューションであれば、Munin のバイナリパッケージが用意されており、セットアップは手軽です。ですが、少し古めの環境になると、munin-node の環境構築だけでも大変な場合があります。特に node は沢山の Perl モジュールが必要です。そんな場合、気合と根性で munin-node を入れるよりは、pmmn を入れる方が手軽な場合があります。

一方で、pmmn は、一部の Munin プラグインを使えません。多くの標準プラグインに対応しているものの、Perl モジュール Munin::Plugin を用いている複雑なプラグインのデータを取得できないためです(df など)。それ意外は、普通の munin-node と同様です。

もし、これまで munin-node のセットアップに挫折した環境があれば、セットアップをお試しいただければと思います( ^ω^) かくいう私も、ある環境で CPAN の環境構築に凹みそうになっていた所を、pmms に救われました。

■pmmn のセットアップ方針

pmmn を動かすには、いくつかの方法があります。当記事では、Linux 上で比較的に手軽な xinetd を使い、ポート 4949 で pmmn をオープンする方法をご紹介します。ファイルを /usr/local/sbin/ に置き、セキュリティ設定を施します。

  • pmmn は /usr/local/sbin/ に置く
  • xinetd 経由
  • /etc/hosts.allow , /etc/hosts.deny でアクセス制限
  • pmms が参照するプラグインの場所は /etc/munin/plugins/ とする
  • プラグインの実体は /usr/share/munin/ とする

他にも、inetd を経由したり、ssh でデータ取得する方法がありますが、詳細は、開発者さんの blog 記事も併せてご覧下さい。

■pmmn のセットアップ

まずはじめに、 pmmn をサーバにダウンロードします。

$ wget https://raw.github.com/munin-monitoring/contrib/master/tools/pmmn/bin/pmmn

ファイルを  /usr/local/sbin/ に起き、パーミッション設定を行います。

# cp ./pmmn /usr/local/sbin/pmmn
# chown root.root /usr/local/sbin/pmmn
# chmod 755 /usr/local/sbin/pmmn

念の為、Perl の構文チェックに異常が無い事を確認します。

# perl -cw /usr/local/sbin/pmmn

/etc/services に Port 4949 の pmms 用サービスを追加します。

# echo 'pmmn 4949/tcp # Poor Man's Munin Node (pmmn)' >> /etc/services

/etc/xinet.d/pmmn を作成します。

service pmmn
{
    disable         = no
    socket_type     = stream
    wait            = no
    user            = root
    env             = MUNIN_LIBDIR=/usr/share/munin
    server          = /home/pmmn/bin/pmmn
    server_args     =  --plugin-dir=/etc/munin/plugins
}

※ MUNIN_LIBDIR の環境変数指定は必須です。後ほど /usr/share/munin にプラグインを起きますが、設置場所を変える場合、この記述の変更を行わないと動作しません。
※–plugin-dir の指定も同様です。/etc/munin/plugins/ には、シンボリック・リンクを作成し必要なプラグインを置きます。

設定を有効にするため xinetd を再起動します。

# /sbin/service xinetd restart
xinetd を停止中:                                           [  OK  ]
xinetd を起動中:                                           [  OK  ]

次に、プラグイン実体を置きます。まずは展開用のディレクトリを作成します。

# mkdir /usr/share/munin/

つぎにプラグインの設置ですが、ソースからコンパイルする方法と、他の Linux サーバから持ってくる方法があります。後者の場合のほうが、手軽です。ここでは、一応正攻法(?)で試みます。

Munin のソースからプラグインを構築します。

$ wget http://jaist.dl.sourceforge.net/project/munin/stable/2.0.14/munin-2.0.14.tar.gz
$ tar xvfz munin-2.0.14.tar.gz
$ cd munin-2.0.14
$ vi Makefile.config

Makefile.config で「LIBDIR」の行を探し出し、書き換えます。

# Where to put internal binaries and plugin repository
#LIBDIR     = $(PREFIX)/lib
LIBDIR = /usr/share/munin/

書き換えたら、プラグインをインストールします。

# make install-node-plugins

次に、プラグインを有効にするため /etc/munin/plugins/ に、利用するプラグインのシンボリック・リンクを作成します。まずはディレクトリを作成します。

# mkdir -p /etc/munin/plugins

それから、シンボリックリンク・リンクを作成します。

ln -s '/usr/share/munin/plugins/acpi' '/etc/munin/plugins/acpi'
ln -s '/usr/share/munin/plugins/cpu' '/etc/munin/plugins/cpu'
ln -s '/usr/share/munin/plugins/entropy' '/etc/munin/plugins/entropy'
ln -s '/usr/share/munin/plugins/forks' '/etc/munin/plugins/forks'
ln -s '/usr/share/munin/plugins/fw_packets' '/etc/munin/plugins/fw_packets'
ln -s '/usr/share/munin/plugins/if_' '/etc/munin/plugins/if_eth0'
ln -s '/usr/share/munin/plugins/if_' '/etc/munin/plugins/if_eth1'
ln -s '/usr/share/munin/plugins/if_err_' '/etc/munin/plugins/if_err_eth0'
ln -s '/usr/share/munin/plugins/if_err_' '/etc/munin/plugins/if_err_eth1'
ln -s '/usr/share/munin/plugins/interrupts' '/etc/munin/plugins/interrupts'
ln -s '/usr/share/munin/plugins/irqstats' '/etc/munin/plugins/irqstats'
ln -s '/usr/share/munin/plugins/load' '/etc/munin/plugins/load'
ln -s '/usr/share/munin/plugins/lpstat' '/etc/munin/plugins/lpstat'
ln -s '/usr/share/munin/plugins/memory' '/etc/munin/plugins/memory'
ln -s '/usr/share/munin/plugins/munin_stats' '/etc/munin/plugins/munin_stats'
ln -s '/usr/share/munin/plugins/netstat' '/etc/munin/plugins/netstat'
ln -s '/usr/share/munin/plugins/nfs4_client' '/etc/munin/plugins/nfs4_client'
ln -s '/usr/share/munin/plugins/nfs_client' '/etc/munin/plugins/nfs_client'
ln -s '/usr/share/munin/plugins/open_files' '/etc/munin/plugins/open_files'
ln -s '/usr/share/munin/plugins/open_inodes' '/etc/munin/plugins/open_inodes'
ln -s '/usr/share/munin/plugins/postfix_mailqueue' '/etc/munin/plugins/postfix_mailqueue'
ln -s '/usr/share/munin/plugins/proc_pri' '/etc/munin/plugins/proc_pri'
ln -s '/usr/share/munin/plugins/processes' '/etc/munin/plugins/processes'
ln -s '/usr/share/munin/plugins/swap' '/etc/munin/plugins/swap'
ln -s '/usr/share/munin/plugins/threads' '/etc/munin/plugins/threads'
ln -s '/usr/share/munin/plugins/uptime' '/etc/munin/plugins/uptime'
ln -s '/usr/share/munin/plugins/users' '/etc/munin/plugins/users'
ln -s '/usr/share/munin/plugins/vmstat' '/etc/munin/plugins/vmstat'

必要に応じて書き換えて下さい。また、プラグインによっては Perl のモジュールが足りないと動作しないので注意が必要です。

これで一通りの準備が終わりました。動作テストしてみます。telnet または nc コマンドで、ポート 4949 に対して接続を試みます。

$ nc localhost 4949

‘LIST’ や ‘FETCH load’ を実行して、正常に応答があるかどうか確認します。次の実行結果は、正常な場合です。

$ nc localhost 4949
# munin node at localhost
LIST
acpi apache_accesses apache_processes apache_volume cpu df df_inode
diskstats entropy forks fw_packets if_eth0 if_eth1 if_err_eth0
if_err_eth1 interrupts irqstats load lpstat memory munin_stats netstat
nfs4_client nfs_client open_files open_inodes postfix_mailqueue proc_
pri processes swap threads uptime users vmstat
FETCH load
load.value 0.03
.

結果が表示されない場合は、プラグインの設置場所やパーミッションを確認します。

あとは、Munin が稼働しているサーバで munin.conf に対象サーバの情報を追加し、グラフが描画されるのと確認します。

最後に、アクセス制限を施しておきます。

# echo 'pmmn: ALL' >> /etc/hosts.deny

hosts.deny  で、全ての環境からの接続を拒否した上で、許可する環境を /etc/hosts.allow に追加して下さい。

pmmn: localhost

記述を追加した後、Munin 動作サーバから telnet や nc で、ポート 4949 に対して接続できるかどうか、確認します。

以上で、pmmn のセットアップはすべて完了です。munin-node のセットアップに挫折した環境でも、データが取れるようになりますので、重宝する場面もあるかと思います( ^ω^)