vmwareのNIC設定変更によるMRTGのトラブルシューティング

■過去のデータを残したい場合にはバックアップをとって下さい。

 今回はNICの順序が原因と疑ってかかっていますので、
 通常、rsync等でバックアップしているかと思いますが、その作業は省略しています。
 「localhost_3.html」「localhost_4.html」は残っており、
 作り直したインデックスページからはリンクされていませんが、
 直リンクで不具合以前の状況が確認できます。

■「mrtg.cfg」に対して以下のようなエラー通知のメールが来ました。
 設定ファイルをCPU、メモリ、ディスクとは別にするというのは正しかったようです。

SNMPGET Problem for ifInOctets.4 ifOutOctets.4 sysUptime sysName on public@local
host::::::v4only

■以下のようにMIBを参照出来るかどうかを確認する。
 「sysUptime」が見つからないようだ。

$ echo 'ifInOctets.3 ifOutOctets.3 sysUptime sysName' | \
for list in `xargs`;do snmptranslate -On -IR "$list";done
.1.3.6.1.2.1.2.2.1.10.3
.1.3.6.1.2.1.2.2.1.16.3
Unknown object identifier: sysUptime
.1.3.6.1.2.1.1.5

■結果をコピペする際に、echo ''で囲って解決できるものを探す。
 v2のMIBのようです。

$ echo '.1.3.6.1.2.1.2.2.1.10.3
.1.3.6.1.2.1.2.2.1.16.3
Unknown object identifier: sysUptime
.1.3.6.1.2.1.1.5' | grep -v Unknown | \
for next in `xargs` ;do snmpwalk -v 1 -c public localhost ${next};done
SNMPv2-MIB::sysName.0 = STRING: sample-server

■「-v 2c」に変更し、再実行

$ echo '.1.3.6.1.2.1.2.2.1.10.3
.1.3.6.1.2.1.2.2.1.16.3
Unknown object identifier: sysUptime
.1.3.6.1.2.1.1.5' | grep -v Unknown | \
for next in `xargs` ;do snmpwalk -v 2c -c public localhost ${next};done
IF-MIB::ifInOctets.3 = No Such Instance currently exists at this OID
IF-MIB::ifOutOctets.3 = No Such Instance currently exists at this OID
SNMPv2-MIB::sysName.0 = STRING: sample-server

■「ifOutOctets.3」「sysUptime」が見つかりません。
 「sysName」は既にあるので、「OBJECT-TYPE」があるのは当然です。

$ echo 'ifInOctets.3 ifOutOctets.3 sysUptime sysName' | \
for list in `xargs`;do \
cat /usr/share/snmp/mibs/* | grep "$list" --color || echo "Not Found $list"; \
done
sysContact.0 or ifInOctets.3.
Not Found ifOutOctets.3
Not Found sysUptime
sysName OBJECT-TYPE
sysName OBJECT-TYPE
sysContact, sysName, sysLocation,

■ところで元の設定ファイルを見ると、上記のようなMIBを参照していません。
 これは他のCPU、メモリ、ディスクの設定ファイルでも同じです。

$ echo 'ifInOctets.3 ifOutOctets.3 sysUptime sysName' | \
for list in `xargs`;do \
sudo cat /etc/mrtg.cfg | grep "$list" --color || echo "Not Found $list";\
done
Not Found ifInOctets.3
Not Found ifOutOctets.3
Not Found sysUptime
Not Found sysName

■コマンドで設定ファイルをチェックしてみますが、そのままだと怒られます。

$ sudo mrtg --check /etc/mrtg.cfg
-----------------------------------------------------------------------
ERROR: Mrtg will most likely not work properly when the environment
variable LANG is set to UTF-8. Please run mrtg in an environment
where this is not the case. Try the following command to start:

env LANG=C /usr/bin/mrtg --check /etc/mrtg.cfg
-----------------------------------------------------------------------

■「/etc/cron.d/mrtg」でも「env LANG=C」があるのでまとめてチェックします。

if [ -x /usr/bin/mrtg ] && [ -r /etc/mrtg.cfg ]; then \
env LANG=C /usr/bin/mrtg /etc/mrtg.cfg 2>&1 | tee -a /var/log/mrtg/mrtg.log ;\
fi

$ echo /etc/mrtg*.cfg | \
for list in `xargs`;do \
echo -n "$list ... ";
sudo env LANG=C /usr/bin/mrtg --check $list && echo "ok"; \
done;echo ""
/etc/mrtg.cfg ... ok
/etc/mrtg_cpu.cfg ... ok
/etc/mrtg_disk.cfg ... ok
/etc/mrtg_mem.cfg ... ok

■ちなみにログを見ると、「localhost_3」「localhost_4」の問題のようです。

$ sudo grep -i error /var/log/mrtg/mrtg.log | tail -4
2011-07-24 19:20:02: ERROR: Target[localhost_3][_IN_] ' $target->[1]{$mode} ' did not eval into defined data
2011-07-24 19:20:02: ERROR: Target[localhost_3][_OUT_] ' $target->[1]{$mode} ' did not eval into defined data
2011-07-24 19:20:02: ERROR: Target[localhost_4][_IN_] ' $target->[2]{$mode} ' did not eval into defined data
2011-07-24 19:20:02: ERROR: Target[localhost_4][_OUT_] ' $target->[2]{$mode} ' did not eval into defined data

■「vmnet1」、「vmnet8」がそれです。

$ sudo grep localhost_[34] /etc/mrtg.cfg | grep SetEnv | awk '{print $3}'
MRTG_INT_DESCR="vmnet1"
MRTG_INT_DESCR="vmnet8"

■NICにポート転送の設定を変更してからのエラーである為、
 認識順序が入れ替わったことが原因と思われます。

$ ip addr 2>&1 | awk -F\: '{print $1 " ->" $2}' | grep -v "^\ "
1 -> lo
2 -> eth0
5 -> vmnet1
6 -> vmnet8

■今回はcfgmakerで作成した順番が保証された設定ファイルなので、まずは手作業で。

$ sudo nl -b a /etc/mrtg.cfg | grep vmnet1 | head -1 | sed s/'00-..-..-..-..-..'/'00-xx-xx-xx-xx-xx'/g
117 ### Interface 3 >> Descr: 'vmnet1' | Name: 'vmnet1' | Ip: '172.16.180.1' | Eth: '00-xx-xx-xx-xx-xx' ###

$ sudo sh -c 'head -n 116 /etc/mrtg.cfg > /etc/mrtg_noerrnic.cfg.tmp'

■NICの設定を外して「temp_noerrnic」ディレクトリに吐き出すようにします。

☆元の作業ディレクトリを確認。

$ grep ^WorkDir /etc/mrtg_noerrnic.cfg
WorkDir: /var/www/mrtg

☆「/var/www/mrtg/temp_noerrnic」が無ければ作成

$ test -d /var/www/mrtg/temp_noerrnic || sudo mkdir /var/www/mrtg/temp_noerrnic

☆「sed」を使って書き換え。

$ sudo sh -c 'sed s%"WorkDir: /var/www/mrtg"%"&/temp_noerrnic"%g /etc/mrtg_noerrnic.cfg.tmp > /etc/mrtg_noerrnic.cfg'

☆書き換え後の作業ディレクトリを確認

$ grep ^WorkDir /etc/mrtg_noerrnic.cfg
WorkDir: /var/www/mrtg/temp_noerrnic

☆3回実行します。

$ for list in `seq 0 2`;do sudo sh -c 'env LANG=C /usr/bin/mrtg /etc/mrtg_noerrnic.cfg';done

☆エラーがないか再確認。
$ sudo sh -c 'env LANG=C /usr/bin/mrtg /etc/mrtg.cfg'

☆問題ありません。

$ ls /var/www/mrtg/temp_noerrnic/
localhost_2-day.png localhost_2-year.png localhost_2.old mrtg-r.png
localhost_2-month.png localhost_2.html mrtg-l.png
localhost_2-week.png localhost_2.log mrtg-m.png

☆元の設定ファイルだと、メールと同じエラーが出ます。

$ sudo sh -c 'env LANG=C /usr/bin/mrtg /etc/mrtg.cfg' 2>&1 | grep -i "error" --color
SNMP Error:
Received SNMP response with error code
error status: noSuchName
SNMP Error:
Received SNMP response with error code
error status: noSuchName
2011-07-24 19:58:07: ERROR: Target[localhost_3][_IN_] ' $target->[1]{$mode} ' did not eval into defined data
2011-07-24 19:58:07: ERROR: Target[localhost_3][_OUT_] ' $target->[1]{$mode} ' did not eval into defined data
2011-07-24 19:58:07: ERROR: Target[localhost_4][_IN_] ' $target->[2]{$mode} ' did not eval into defined data
2011-07-24 19:58:07: ERROR: Target[localhost_4][_OUT_] ' $target->[2]{$mode} ' did not eval into defined data

■設定ファイルを作り直すことで解決しそうです。

☆元の作成方法を確認します。

$ sudo head -2 /etc/mrtg.cfg
# Created by
# /usr/bin/cfgmaker --global "WorkDir: /var/www/mrtg" --output /etc/mrtg.cfg public@localhost3回実行します。

$ sudo sh -c '/usr/bin/cfgmaker --global "WorkDir: /var/www/mrtg" --output /etc/mrtg.cfg public@localhost'

☆エラーがないか確認します。
$ sudo sh -c 'env LANG=C /usr/bin/mrtg /etc/mrtg.cfg'

☆設定ファイルを確認してみます。やはりNICの認識順序が原因です。

$ sudo grep 'vmnet[18]' /etc/mrtg.cfg | grep \# | cut -c -15
### Interface 5
### Interface 6

☆エラーがなくなったので、インデックスページを作り直します。

$ sudo indexmaker /etc/mrtg.cfg --column=1 --output=/var/www/mrtg/index.html

■ブラウザから状況を再確認して問題ないことを確認します。

☆「/var/www/mrtg/temp_noerrnic/」以下は残りますが、スケジューリングしていませんし、
 エビデンス(証拠/作業根拠/検証結果)として残しておきます。