2011/09/19 CentOS5.5





MRTGをインストールする

MRTGと言えば、有名なグラフ生成ツールです。
SNMPを使用してのCPUの変動グラフ、ネットワークの使用率などをグラフ化します。
ただ構築までが割とめんどくさいので、最短手順で行きたいと思います。
必要なのはWebサーバ、MRTGパッケージ、GCC、Perl、gd、libpng、zlib…ですが、今はyumで行けます。

Webサーバの確認
SNMPのインストール
ファイアウォールの開放
MRTGのインストール
mrtg.cfgの生成
テスト出力
MRTGディレクトリをWebに公開する
cronを設定する
CPUの使用率を出力
indexmakerについて
Webサーバの確認
Webサーバが入っているかを確認します。

#rpm -q httpd

入っていなければ、yumからインストールします。

#yum install httpd

Webサーバを起動させ、自動起動に設定します。

#service httpd start
#chkconfig httpd on

他端末のブラウザから、テストページが表示されるかを確認します。



SNMPのインストール
次にSNMPが入っているかを確認します。
デフォルトでは入ってません。ついでにsnmpwalkを使う可能性があるので、snmp-utilsも入れておきます。

SNMPをインストールして設定する
#yum install net-snmp
#yum install net-nemp-utils

/etc/snmp/snmp.confを最低限編集します。
赤がコメントアウトしたところ、青が追記部分です。それぞれの場所を探して、記述します。

snmp.conf

#       sec.name  source          community
#com2sec notConfigUser  default       public
com2sec local localhost public
com2sec mynetwork 192.168.1.0/24 public        #アクセス許可セグメントの定義とコミュニティ名の設定

#group   notConfigGroup v1           notConfigUser
#group   notConfigGroup v2c           notConfigUser
group MyROGroup v1 local
group MyROGroup v2c local
group MyROGroup v1 mynetwork
group MyROGroup v2c mynetwork       #グループ名の定義と使用プロトコルバージョンとセグメント名

#view    systemview    included   .1.3.6.1.2.1.1
#view    systemview    included   .1.3.6.1.2.1.25.1.1
view    all    included   .1 80     #定義名と閲覧許可するOID  

#access MyROGroup ""      any       noauth    0      all    none   none
#access MyRWGroup ""      any       noauth    0      all    all    all
access MyROGroup "" any noauth exact all none none      #グループ名と閲覧許可OIDの定義  



次にSNMPデーモンを起動してします。

#service snmpd start
#chkconfig snmpd on

snmpが正常動作しているかを確認します。
正常に動作していれば、OIDがずらっと表示されます。

#snmpwalk -v 2c -c public 192.168.1.x



ファイアウォールの開放
ファイアウォールでWebとSNMPのポートを開放します。

GUIでの設定
[システム]-[管理]-[セキュリティとファイアウォールの管理]
Webサーバのポートを開放します。


SNMPのためにUDPのポートを追加します。



CUIでの設定
/etc/sysconfig/iptablesにTCP80とUDP161から162を開放しています。


サービスを再起動します。
#service iptables restart

MRTGのインストール
次にmrtg本体をインストールします。yumから入れればいろいろやってくれます。

#yum install mrtg

mrtg.cfgの生成
コンフィグを生成します。
コンフィグ生成コマンドを使用するのですが、さすがMRTGはネットワーク転送量を表示することに特化しているだけあって、コマンドで生成できるのはネットワークインターフェイスだけです。
コンフィグ生成のオプションによって様々なことが設定できますが、後でコンフィグファイルを編集しても一緒です。

今回はCentOS自身のネットワーク転送量をグラフ化してみます。
どこのサイトを見ても、大体同じコマンドが例示されています。

#cfgmaker --ifref=descr --ifdesc=descr public@IPアドレス > /etc/mrtg/mrtg.cfg

cfgmakerの出力をmrtg.cfgへリダイレクトします。
もちろん「public」はSNMPのコミュニティ名です。対象アドレスのNICを全て列挙してくれます。
この「コミュニティ名@IPアドレス」をスペースで複数並べれば、コンフィグに初めから別のネットワーク機器の情報収集などをまとめて生成できます。
複数のルータやスイッチを監視する場合です。

複数のターゲットを指定する
#cfgmaker --ifref=descr --ifdesc=descr public@IPアドレスA public@IPアドレスB public@IPアドレスC > /etc/mrtg/mrtg.cfg

オプションの意味
「--ifref」 ナニで監視NICを指定するか。「--ifref=descr」は「ifdescで指定されたものを使用する」です。
「--ifdesc」 どんな名前で監視NICを表現するか。「--ifdesc=desc」はNICのデスクリプションで表示する。

「--ifref=descr --ifdesc=descr」を使用した場合とそうでない場合の違いを比べて見ます。

二つのオプションを指定して出力する
Target[192.168.1.99_eth0]: \eth0:public@192.168.1.99:

オプションなしで出力されるターゲット(NICをインターフェイス番号で指定)
Target[192.168.1.99_2]: 2:public@192.168.1.99:

オプションで指定したほうが今後の閲覧も直感的ですね。
オプションはMRTGの日本語本家に解説があります。

出力したmrtc.cfgの冒頭部分、グラフデータの出力先ディレクトリを/var/html/mrtgに編集します。

mrtg.cfg

#  for UNIX
#WorkDir: /home/http/mrtg
WorkDir: /var/www/mrtg   #重要 出力ディレクトリ。httpd以降にMRTGをインストールすればここがデフォルトになります
                                      #httpd側でもこのフォルダにセキュリティとエイリアスを準備してます。とりあえず従う。
#  or for NT
# WorkDir: c:\mrtgdata

### Global Defaults

#  to get bits instead of bytes and graphs growing to the right
Options[_]: growright, bits

EnableIPv6: no

なぜ/var/html/mrtgかと言うと、MRTGがインストール時にすでにhttpdにエイリアスとセキュリティを作成しているからです。
出力パス、閲覧URLを変更したければ、全てが動作するのを確認してから変更するのがいいでしょう。

テスト出力
手動でMRTGをテスト出力します。
と、ここまで文字コードの問題が発生します。
いまどきのLinuxはUTF-8を使用していることが多く、EUCを使いたがるMRTGは動作しません。
具体的には、環境変数の文字コードがEUCでないとMRTGが動作しません。エラーを出力します。

※昔はmrtg.cfgもEUCで記述しなければなりませんでした。
 ターミナルで文字化け表示されてしまう日本語などは編集作業が困難でした。
 そこでUTF版のmrtg.cfg.utfを日本語で記述し、EUC版のmrtg.cfg.eucへ変換して読み込ませていました。
 メンテナンスもその都度、UTFのコンフィグをEUCへ変換する作業が不可欠です。
 今は時代も変わり、日本語を使用したmrtg.cfgをUTF-8のまま読み込ませても、特に文字化けすることなく
 HTMLを出力してくれるようです。


そこでコマンドは環境変数をEUCにセットした状態で行います。
mrtgは実行の都度、cfgファイルを指定する必要があります。

MRTGは過去二回のキャッシュを確認するため、最初の二回はエラーを出力する場合があります。
とりあえず三回実施します。

#env LANG=ja_JP.EUC_JP /usr/bin/mrtg /etc/mrtg/mrtg.cfg
#env LANG=ja_JP.EUC_JP /usr/bin/mrtg /etc/mrtg/mrtg.cfg
#env LANG=ja_JP.EUC_JP /usr/bin/mrtg /etc/mrtg/mrtg.cfg

mrtg.cfgで指定した「/var/html/mrtg」へhtmlファイルを含めたpngファイルが出力されているかを確認します。

# ls /var/www/mrtg/
192.168.1.2_eth0-day.png     192.168.1.2_eth0.html    mrtg-l.gif  mrtg-r.gif
192.168.1.2_eth0-month.png  192.168.1.2_eth0.log     mrtg-l.png  mrtg-r.png
192.168.1.2_eth0-week.png   192.168.1.2_eth0.old     mrtg-m.gif  mrtg-ti.gif
192.168.1.2_eth0-year.png    favicon.ico              mrtg-m.png  mrtg-ti.png


MRTGディレクトリをWebに公開する
httpdので用意されたMRTGディレクトリのセキュリティを確認します。
デフォルトでは、MRTGディレクトリの閲覧はローカルホストからのみ受け付けています。
それで不都合があるのなら、httpdのMRTGディレクトリのセキュリティを緩和します。

httpdの設定ファイルに、mrtgディレクトリエイリアスが作成されており、そこにアクセス権が設定してあります。
アクセス許可セグメントがループバックだけになっているので、LANセグメントを設定します。
mrtg.confはyumから、httpdより後にMRTGをインストールしていれば配置されているはずです。
無ければ手作業で作成します。

#cd /etc/httpd/conf.d/
#vi mrtg.conf

mrtg.conf

Alias /mrtg /var/www/mrtg
<Location /mrtg>
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1 192.168.1 #追加 192.168.1.xのセグメントからはアクセスを許可する
    Allow from ::1
    # Allow from .example.com
</Location>


httpdをリロードして、設定を読み込ませます。

#service httpd reload

ブラウザからアクセスして、画面が表示出来るかを確認します。
http://IPアドレス/mrtg




cronを設定する
cronに記述して、定期実行をかけます。
通常MRTGは5分に一回を想定しています。

設定の仕方は二種類あります。

1.cronに直接コマンドを記述する
 /etc/crontabを編集し、以下の行を追加する。

crontab
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
*/5 * * * * root env LANG=ja_JP.EUC_JP /usr/bin/mrtg /etc/mrtg/mrtg.cfg

crondを再起動します。
#service crond restart


2.cronにシェルスクリプトを呼び出させる
 yum、つまりRPMからMRTGをインストールすると、呼び出し用のシェルスクリプトがcronディレクトリへ作成されます。
 実行コマンド以外にも記述できるので、こちらのほうが柔軟性があります。

/etc/cron.d/mrtgへ実行権限を与えます。
#chmod 755 /etc/cron.d/mrtg

crontabを編集します。

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
*/5 * * * * root /etc/cron.d/mrtg

crondを再起動します。
#service crond restart

コマンドが五分毎に実行され、グラフが出力されることを確認します。



CPU・メモリの使用率を出力
MRTGはSNMPでの数値取得によりグラフを生成します。
なので他の値も収集できます。snmpwalkを使用して情報を確認しながらOIDを記述します。

CPUの使用率を出力
/etc/mrtg/mrtg.cfgに以下のコンフィグを追加します。

mrtg.cfg(追加)

Target[localhost_cpu]: .1.3.6.1.4.1.2021.10.1.5.1&.1.3.6.1.4.1.2021.10.1.5.2:public@127.0.0.1
MaxBytes[localhost_cpu]: 100
Unscaled[localhost_cpu]: dwmy
Options[localhost_cpu]: gauge, absolute, growright, noinfo, nopercent
YLegend[localhost_cpu]: CPU Load(%)
ShortLegend[localhost_cpu]: (%)
LegendI[localhost_cpu]: 1分間平均
LegendO[localhost_cpu]: 5分間平均
Legend1[localhost_cpu]: 1分間平均(%)
Legend2[localhost_cpu]: 5分間平均(%)
Title[localhost_cpu]: localhost_CPU使用率
PageTop[localhost_cpu]: <h1>localhost_CPU使用率</h1>

OID「.1.3.6.1.4.1.2021.10.1.5.1」で1分間平均、「.1.3.6.1.4.1.2021.10.1.5.2」で5分間平均を取得しています。


メモリ使用率
こちらはfreeコマンドで調べた最大メモリを手入力してやる必要があります。
totalの縦列の数字を使用します。


mrtg.cfg(追加)

Target[localhost_mem]: .1.3.6.1.4.1.2021.4.6.0&.1.3.6.1.4.1.2021.4.4.0:public@127.0.0.1
#物理メモリの最大値
MaxBytes1[localhost_mem]: 1035064
#スワップメモリの最大値
MaxBytes2[localhost_mem]: 2095096
Unscaled[localhost_mem]: dwmy
Options[localhost_mem]: gauge, absolute, growright, noinfo
YLegend[localhost_mem]: Mem Free(Bytes)
ShortLegend[localhost_mem]: KBytes
kilo[localhost_mem]: 1024
kMG[localhost_mem]: k,M
LegendI[localhost_mem]: Real
LegendO[localhost_mem]: Swap
Legend1[localhost_mem]: 空き物理メモリ[MBytes]
Legend2[localhost_mem]: 空きスワップメモリ[MBytes]
Title[localhost_mem]: localhost_空きメモリ量
PageTop[localhost_mem]: <H1> localhost_空きメモリ量 </H1>

OID 「.1.3.6.1.4.1.2021.4.6.0」で物理メモリ、「.1.3.6.1.4.1.2021.4.4.0」でスワップメモリの空き容量を取得してます。

コマンドでも確認できます。
#snmpwalk -v 2c -c public 127.0.0.1 .1.3.6.1.4.1.2021.4.6.0

indexmakerについて
MRTGは一つの監視対象に対して、一つのhtmlファイルを出力します。
しかし監視対象が複数あれば、トップページで状態を一覧表示したいものです。

そういう時に使うのがindexmakerというツールです。
MRTG日本語本家に解説があります。
コマンドで指定すれば、サムネイルを張り付けたindex.htmlを生成してくれます。

が、HTMLが記述できる人なら自分なりのindex.htmlを作成したほうが手っ取り早いでしょう。
トップページに各機器の今日のグラフを貼り付け、画像から各機器のhtmlファイルへリンクすればよいのですから。

こんな感じになります。







prev.gif