2016年6月23日木曜日

MRTGの設定を行う(メモリー使用量編)

別々の最大値を持つMRTGの設定として、メモリー使用量のMRTG設定をしてみました。実メモリとスワップの使用量を表示させてみることにします。

さて、CentOS のメモリーの使い方なのですが、空きがあると積極的に使うようになっているようです。

# free
             total       used       free     shared    buffers     cached
Mem:       1922620    1811352     111268          0     146344     240376
-/+ buffers/cache:    1424632     497988
Swap:      4128760        896    4127864

上の例ですと、free が空きメモリー量ではなく、実際の空きメモリはfree + buffers + cached になるようです。

Target の指定の中で計算をすることもできるようです。しかしながら一行の記述が長くなる、ぱっと見て自分の力量では理解ができないこともあり、シェルスクリプトで計算をすることにしました。

使い回すかどうか先のことは分かりませんが、IPアドレスを引数にし他機でも使えるように memoy.sh という名で作ってみました。

#!/bin/sh

IP=$1

SYS=`/usr/bin/snmpwalk -v 1 -c test-ro $IP .1.3.6.1.2.1.1.5 | cut -d " " -f 4`
SWAP_ALL=`/usr/bin/snmpwalk -v 1 -c
test-ro $IP .1.3.6.1.4.1.2021.4.3.0 | cut -d " " -f 4`
SWAP_FREE=`/usr/bin/snmpwalk -v 1 -c test-ro $IP .1.3.6.1.4.1.2021.4.4.0 | cut -d " " -f 4`
MEM_ALL=`/usr/bin/snmpwalk -v 1 -c test-ro $IP .1.3.6.1.4.1.2021.4.5.0 | cut -d " " -f 4`
MEM_FREE=`/usr/bin/snmpwalk -v 1 -c test-ro $IP .1.3.6.1.4.1.2021.4.6.0 | cut -d " " -f 4`
MEM_BUF=`/usr/bin/snmpwalk -v 1 -c test-ro $IP .1.3.6.1.4.1.2021.4.14.0 | cut -d " " -f 4`
MEM_CACHE=`/usr/bin/snmpwalk -v 1 -c test-ro $IP .1.3.6.1.4.1.2021.4.15.0 | cut -d " " -f 4`

MEM_USE=`/usr/bin/expr $MEM_ALL - \( $MEM_FREE + $MEM_BUF + $MEM_CACHE \)`
SWAP_USE=`/usr/bin/expr $SWAP_ALL - $SWAP_FREE`


echo $MEM_USE
echo $SWAP_USE
echo ""
echo $SYS
exit 0

mrtg.cfg の設定はこんな感じ。(抜粋)
今までは MaxBytes の指定でしたが、別々に指定をしたいので MaxBytesの代わりに MaxBytes1と MaxBytes2を指定しています。

Target[nmcent64_mem]: `/etc/mrtg/memory.sh localhost`
Directory[nmcent64_mem]: nmcent64/memory
#
# Max Memory
MaxBytes1[nmcent64_mem]: 1922620
#
# Max Swap
MaxBytes2[nmcent64_mem]: 4128760
Unscaled[nmcent64_mem]: dwmy
Options[nmcent64_mem]: gauge, absolute, growright, noinfo
YLegend[nmcent64_mem]: Mem Free(Bytes)
ShortLegend[nmcent64_mem]: KBytes
kilo[nmcent64_mem]: 1024
kMG[nmcent64_mem]: k,M
LegendI[nmcent64_mem]: Real
LegendO[nmcent64_mem]: Swap
Legend1[nmcent64_mem]: 空き物理メモリ[MBytes]
Legend2[nmcent64_mem]: 空きスワップメモリ[MBytes]
Title[nmcent64_mem]: localhost_空きメモリ量
PageTop[nmcent64_mem]: <H1>nmcent64_空きメモリ量</H1>

で、実際に動かした結果はこんな感じ。

day

赤い線がそれぞれ MaxBytes1 と MaxBytes2 の最大値を示しています。変動がほとんど無いのでつまらないグラフですねぇ... スワップなんか使用0 に近い状態で推移しているし。

2値を表示する練習で作成してみましたが、使用量ではなく使用率にした百分率表示の方がいいかもしれないですね。

2016年6月17日金曜日

snmpdの設定を行う(ディスク使用率編)

dfコマンドで現在の使用状況を表示させてみました。

# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/vg_nmcent64-lv_root
                       43G  2.2G   39G   6% /
tmpfs                 939M     0  939M   0% /dev/shm
/dev/sda1             485M   37M  423M   8% /boot

んー、MRTGで表示させるのはルートのみですかね。後はなくてもいいよね。とはいえ、MRTGは2値が必要なので、/bootも表示させることにしてみます。

前回作成したsnmpd.confにディスク関係のパラメータを追記します。(赤字が追記部分。)追記が無いと、MIB値を取ろうと思っても値が返ってきません。

#       sec.name        source            community
com2sec notConfigUser   192.168.15.0/24   test-ro
com2sec notConfigUser   localhost         test-ro

#                       sec.model         sec.name
group   notConfigGroup  v1                notConfigUser
group   notConfigGroup  v2c               notConfigUser

#           incl/excl   subtree         mask
view all    included    .1              80

#                       context sec.model sec.level prefix read   write notify
access notConfigGroup   ""      any       noauth    exact  all    none  none

#
disk / 10000
disk /boot 10000

追記が終了したら、snmpdの再起動を実行します。

ディスク関連のOID (1.3.6.1.4.1.2021.9) を指定して snmpwalkを実行します。

#  snmpwalk -v 1 -c test-ro localhost 1.3.6.1.4.1.2021.9
UCD-SNMP-MIB::dskIndex.1 = INTEGER: 1
UCD-SNMP-MIB::dskIndex.2 = INTEGER: 2
UCD-SNMP-MIB::dskPath.1 = STRING: /
UCD-SNMP-MIB::dskPath.2 = STRING: /boot
UCD-SNMP-MIB::dskDevice.1 = STRING: /dev/mapper/vg_nmcent64-lv_root
UCD-SNMP-MIB::dskDevice.2 = STRING: /dev/sda1
UCD-SNMP-MIB::dskMinimum.1 = INTEGER: 10000
UCD-SNMP-MIB::dskMinimum.2 = INTEGER: 10000
UCD-SNMP-MIB::dskMinPercent.1 = INTEGER: -1
UCD-SNMP-MIB::dskMinPercent.2 = INTEGER: -1
UCD-SNMP-MIB::dskTotal.1 = INTEGER: 44969032
UCD-SNMP-MIB::dskTotal.2 = INTEGER: 495844
UCD-SNMP-MIB::dskAvail.1 = INTEGER: 40482144
UCD-SNMP-MIB::dskAvail.2 = INTEGER: 432895
UCD-SNMP-MIB::dskUsed.1 = INTEGER: 2202552
UCD-SNMP-MIB::dskUsed.2 = INTEGER: 37349
UCD-SNMP-MIB::dskPercent.1 = INTEGER: 5
UCD-SNMP-MIB::dskPercent.2 = INTEGER: 8
UCD-SNMP-MIB::dskPercentNode.1 = INTEGER: 2
UCD-SNMP-MIB::dskPercentNode.2 = INTEGER: 0
UCD-SNMP-MIB::dskTotalLow.1 = Gauge32: 44969032
UCD-SNMP-MIB::dskTotalLow.2 = Gauge32: 495844
UCD-SNMP-MIB::dskTotalHigh.1 = Gauge32: 0
UCD-SNMP-MIB::dskTotalHigh.2 = Gauge32: 0
UCD-SNMP-MIB::dskAvailLow.1 = Gauge32: 40482144
UCD-SNMP-MIB::dskAvailLow.2 = Gauge32: 432895
UCD-SNMP-MIB::dskAvailHigh.1 = Gauge32: 0
UCD-SNMP-MIB::dskAvailHigh.2 = Gauge32: 0
UCD-SNMP-MIB::dskUsedLow.1 = Gauge32: 2202552
UCD-SNMP-MIB::dskUsedLow.2 = Gauge32: 37349
UCD-SNMP-MIB::dskUsedHigh.1 = Gauge32: 0
UCD-SNMP-MIB::dskUsedHigh.2 = Gauge32: 0
UCD-SNMP-MIB::dskErrorFlag.1 = INTEGER: noError(0)
UCD-SNMP-MIB::dskErrorFlag.2 = INTEGER: noError(0)
UCD-SNMP-MIB::dskErrorMsg.1 = STRING:
UCD-SNMP-MIB::dskErrorMsg.2 = STRING:

出力結果から

/ → UCD-SNMP-MIB::dskPercent.1

/boot → UCD-SNMP-MIB::dskPercent.2

を指定すればよいようです。ついでにOIDも調べておくことにします。(UCD-SNMP-MIB::dskPercent.1 で指定してもいいのだとは思いますが。)

#  snmpwalk -On -v 1 -c test-ro localhost  UCD-SNMP-MIB::dskPercent.1
.1.3.6.1.4.1.2021.9.1.9.1 = INTEGER: 5
#  snmpwalk -On -v 1 -c test-ro localhost  UCD-SNMP-MIB::dskPercent.2
.1.3.6.1.4.1.2021.9.1.9.2 = INTEGER: 8



2016/06/23 追記
  OIDを調べるには snmptranslate ってコマンドがあるんですね。こんな感じ

# snmptranslate -On -Ir UCD-SNMP-MIB::dskPercent.1
.1.3.6.1.4.1.2021.9.1.9.1


 

直接 mrtg.cfg を編集してもよいのですが、エラーが発生することを考慮し test.cfg に記述→動作確認→問題が無ければ mrtg.cfg に反映させることにします。(## Disk Used ##以下になります。)

test.cfg 内容はこんな感じ。テスト機用に色々とMRTGの設定をする予定なので、ディレクトリはテスト機のホスト名 nmcet64を作成し、配下に disk とか cpu 等々を作成します。

HtmlDir: /var/www/mrtg
ImageDir: /var/www/mrtg
LogDir: /var/lib/mrtg
ThreshDir: /var/lib/mrtg

Options[_]: growright, bits

## Disk Used ##
Target[disk]: .1.3.6.1.4.1.2021.9.1.9.1&.1.3.6.1.4.1.2021.9.1.9.2:test-ro@localhost
Directory[disk]: nmcent64/disk

MaxBytes[disk]: 100
Unscaled[disk]: dwmy
Options[disk]: gauge, absolute, growright, noinfo, nopercent
YLegend[disk]: Disk Used(%)
ShortLegend[disk]: (%)
LegendI[disk]: / Disk Used
LegendO[disk]: /boot Disk Used
Legend1[disk]: / Disk Used(%)
Legend2[disk]: /boot Disk Used(%)
Title[disk]: ディスク使用率
PageTop[disk]: <H1>nmcent64_ディスク使用率</H1>

では 3回ほど動かしてみます。

# env LANG=C mrtg /etc/mrtg/test.cfg
WARNING: /var/www/mrtg/disk/ did not exist I will create it now
WARNING: /var/lib/mrtg/disk/ did not exist I will create it now
2016-06-17 15:17:26, Rateup WARNING: /usr/bin/rateup could not read the primary log file for disk
2016-06-17 15:17:26, Rateup WARNING: /usr/bin/rateup The backup log file for disk was invalid as well
2016-06-17 15:17:26, Rateup WARNING: /usr/bin/rateup Can't remove disk.old updating log file
2016-06-17 15:17:26, Rateup WARNING: /usr/bin/rateup Can't rename disk.log to disk.old updating log file

# env LANG=C mrtg /etc/mrtg/test.cfg
2016-06-17 15:17:29, Rateup WARNING: /usr/bin/rateup Can't remove disk.old updating log file

# env LANG=C mrtg /etc/mrtg/test.cfg

エラーは発生しませんでしたので、mrtg.cfg に設定を反映することにしました。

2016年6月16日木曜日

snmpdの設定を行う(基礎編)

せっかくMRTGを入れたので、テスト機のディスク使用率とかCPU使用率なんかを表示できるように仕様と設定を行ってみました。

元からは入っている /etc/snmp/snmpd.conf  はコメントが多く、見るのが大変なので新規に作成することにしました。元ファイルはコメント等を参照することもあるので、snmpd.conf.orig にて保存。

snmpd.conf の設定に最小限必要なのは

  • コミュニティ
  • セキュリティグループ
  • ビュー
  • アクセスス権限の設定

の4つのようです。ネットワークチェンジニアとしてさんのsnmpd設定方法を参考に必要最低限の snmpd.conf を作成しました。

#       sec.name        source            community
com2sec notConfigUser   192.168.15.0/24   test-ro
com2sec notConfigUser   localhost         test-ro

#                       sec.model         sec.name
group   notConfigGroup  v1                notConfigUser
group   notConfigGroup  v2c               notConfigUser

#           incl/excl   subtree         mask
view all    included    .1              80

#                       context sec.model sec.level prefix read   write notify
access notConfigGroup   ""      any       noauth    exact  all    none  none

snmpd を再起動します。

# service snmpd restart
snmpd を停止中:                                            [ OK  ]
snmpd を起動中:                                            [ OK  ]

snmpwalk で確認をしてみます。

#  snmpwalk -v 1 -c test-ro localhost system
SNMPv2-MIB::sysDescr.0 = STRING: Linux nmcent64 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10

(snip)

SNMPv2-MIB::sysORUpTime.8 = Timeticks: (4) 0:00:00.04

問題なさそうです。
次に別のマシンから snmpwalk の確認を行ってみます。

$  snmpwalk -v 1 192.168.15.251 -c test-ro system
Timeout: No Response from 192.168.15.251

あら、タイムアウトになってしまいます。設定ファイルには問題は無いように見えますので、ネットワーク制御関連の設定で漏れが無いか考えてみることにします。

おそらく FWであろうと iptables の設定を確認します。

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ftp
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpts:10500:10550
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

ビンゴです、UDP/161 が開いていません。(http・https、ftp は自分で開けたんだっけ?) Trustゾーンに設置しているテスト機かつ今後FWの設定をするのも面倒なので、FW機能は使わないことにしました。

# chkconfig iptables off

# service iptables stop
iptables: ファイアウォールルールを消去中:                  [  OK  ]
iptables: チェインをポリシー ACCEPT へ設定中filter         [  OK  ]
iptables: モジュールを取り外し中:                          [  OK  ]

再度別マシンからテストを行う。はい、無事出力がされました。

後は、なにをMRTGで表示させるかですね。まずはディスク使用率とCPU使用率を表示できるよう設定をしてみようと思います。

2016年6月9日木曜日

CentOSにMRTGをインストールする(その2)

昨日はPalo Altoに対し、snmpwalk では答えが返ってくるけど、snmpgetでは答えが返ってこないのが仕様かと思っておりました。

snmpwalk で打ったコマンドをよく見ると バージョン 2c を指定しているではありませんか。

# snmpwalk -v2c -c testcom 192.168.17.1 .1.3.6.1.2.1.25.3.3.1.2.2

で、snmpget で答えが返ってこないと勘違いしていたときはバージョン1を指定していました。
"-v 1" → "-v 2c" に変更すれば、期待する答えが返ってきました。

# snmpget -c testcom -v 1 192.168.17.1 .1.3.6.1.2.1.25.3.3.1.2.2

ということで、mrtg のTarget行のオプションを調べてみたら、

SNMPv2c

もし速いルータを持っているなら、ifHC*カウンタを突つきたいかもしれません。 この機能はSNMPv2cへスイッチすることによって利用可能になります。 残念なことに、全てのデバイスがSNMPv2cをサポートしているわけではありません。 もしこれが動くなら、5分間の問い合わせインターバル中にカウンタがラップさ れるのを防ぐことができます。通常の32ビットではなく64ビットを使うことができ ます。

例: 

Target[ezwf]: 2:public@router1:::::2

ということで Target行の機器指定の後に :::::2 を付けないと駄目なようです。

念のため、Palo Alto で使える snmpのバージョンを確認してみました。バージョン2c と 3が使えるようですね。

palo-snmp

これで自分もレベル2位に上がったかな?

2016年6月8日水曜日

CentOSにMRTGをインストールする

お仕事で運用しているPalo AltoのCPU使用率を時系列で見たいため、MRTGをインストールして見ることにした。

前回の基本インストールで webサーバはインストール済み。snmp関連とMRTGのインストールを実行しました。(横着して –y オプションを指定しているが、確認しながらインストールするのだったら無しが吉。)

# yum -y install net-snmp net-snmp-utils mrtg

snmp関連の設定は共通の設定を使い回しているので割愛します。

サービスの起動とシステム起動時に自動起動するよう設定を行います。(とうか、ターゲットが今回は自機ではないのでsnmpdは動いていなくてもいいんだけど。そのうち自機もMRTGで値を表示する予定なので、事前準備ということで。)

# serive snmpd start
Starting snmpd: [ OK ]

# chkconfig snmpd on

動作確認 (testcomはsnmpd.confで設定したコミュニティ名)
だらだらとMIBの表示されているので問題はなさそうです。

# snmpwalk -v2c -c testcom 192.168.17.1 system
SNMPv2-MIB::sysDescr.0 = STRING: Palo Alto Networks PA-3000 series firewall
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.25461.2.3.17
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (2632929089) 304 days, 17:41:30.89
SNMPv2-MIB::sysContact.0 = STRING: Not Set
SNMPv2-MIB::sysName.0 = STRING: fw01
SNMPv2-MIB::sysLocation.0 = STRING: Unknown
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (1) 0:00:00.01

mrtg.cfg の作成ですが cfgmaker ではなく直接作成してみました。

表示・集計用のファイルですが、デフォルトですとそれぞれ
/var/www/mrtg
/var/lib/mrtg
に作成されます。

今は1ファイルだけなのでデフォルト設定でもよいのですが、将来(あるのか?)色々とMRTGで表示をすることを鑑み、なんたらmrtg の下にディレクトリを作成し保存することにしました。Targetの下に記述してあるDirectoryなんちゃらで保存先を指定します。

HtmlDir: /var/www/mrtg
ImageDir: /var/www/mrtg
LogDir: /var/lib/mrtg
ThreshDir: /var/lib/mrtg

Options[_]: growright, bits


Target[fw01_cpu]: .1.3.6.1.2.1.25.3.3.1.2.1&.1.3.6.1.2.1.25.3.3.1.2.2:testcom@192.168.17.1:
Directory[fw01_cpu]: fw01_cpu
MaxBytes[fw01_cpu]: 100
Unscaled[fw01_cpu]: dwmy
Options[fw01_cpu]: gauge, absolute, growright, noinfo, nopercent
YLegend[fw01_cpu]: CPU Load(%)
ShortLegend[fw01_cpu]: (%)
LegendI[fw01_cpu]: 1分間平均
LegendO[fw01_cpu]: 5分間平均
Legend1[fw01_cpu]: 1分間平均(%)
Legend2[fw01_cpu]: 5分間平均(%)
Title[fw01_cpu]: fw01_CPU使用率
PageTop[fw01_cpu]: <h1>Palo Alto_CPU使用率</h1>

さて、これでmrtgを 3回起動すれば(過去ファイルを処理するため初回は 2回目実行分まで警告が出るため) ok!  と思ったのですがエラーで撃沈。

SNMP Error:
no response received
SNMPv1_Session (remote host: "192.168.17.1" [192.168.17.1].161)
                  community: "testcom"
                 request ID: 266603886
                PDU bufsize: 8000 bytes
                    timeout: 2s
                    retries: 5
                    backoff: 1)
at /usr/bin/../lib64/mrtg2/SNMP_util.pm line 492
SNMPGET Problem for .1.3.6.1.2.1.25.3.3.1.2.1 .1.3.6.1.2.1.25.3.3.1.2.2 sysUptime sysName on testcom@192.168.17.1::::::v4only
at /usr/bin/mrtg line 2203
2016-06-08 13:25:11: WARNING: skipping because at least the query for .1.3.6.1.2.1.25.3.3.1.2.1 on  192.168.17.1 did not succeed
2016-06-08 13:25:11: WARNING: no data for .1.3.6.1.2.1.25.3.3.1.2&.1.3.6.1.2.1.25.3.3.1.2:testcom@192.168.17.1. Skipping further queries for Host 192.168.17.1 in this round.
2016-06-08 13:25:21: ERROR: Target[fw01_cpu][_IN_] ' $target->[0]{$mode} ' did not eval into defined data
2016-06-08 13:25:21: ERROR: Target[fw01_cpu][_OUT_] ' $target->[0]{$mode} ' did not eval into defined data

どうもsnmpgetでの情報取得に失敗しているようです。snmpwalkは値が返ってくるのに、なんでsnmpgetで失敗するのか見当が付きません。試しに別の機器にsnmpwalkとsnmpgetを実行してみると問題なく値が返ってくる。

色々調べましたが、数時間で解決はしませんでした...


2016/06/08 16:52 追記

Tergetの記述で ipアドレス:::::2 とすれば問題が解決することが判明。
もう少々 MRTG の記述を勉強しないと駄目だな。→ ちょっとしました(2016/06/09)。
以下、やっつけスクリプトの手順を書いておく。snmpで値が取得できず、スクリプトを書く必要に迫られるケースもあるはずなので。


とはいうものの、

  1. 第1パラメータ値
  2. 第2パラメータ値
  3. 稼働時間
  4. ホスト名

を返してあげればいいらしいことが分かりました。snmpwalkで値が返ってくるので、スクリプトを作成することにしました。ファイル名はfw01-cpu.shとし、/etc/mrtg 配下に置くことにします。

#!/bin/sh

LANG=C
export LANG

CPU1=`snmpwalk -v2c -c testcom 192.168.17.1 .1.3.6.1.2.1.25.3.3.1.2.1 | cut -d " " -f 4`
CPU5=`snmpwalk -v2c -c testcom 192.168.17.1 .1.3.6.1.2.1.25.3.3.1.2.2 | cut -d " " -f 4`
UPTIME=`snmpwalk -v2c -c testcom 192.168.17.1 .1.3.6.1.2.1.1.3 | cut -d " " -f 5-8`

echo "$CPU1"
echo "$CPU5"
echo "$UPTIME"
echo "CPU Load Average(fw01)"

mrtg.cfg の Targetなんちゃら行を次のように書き換えました。

Target [fw01_cpu]: .1.3.6.1.2.1.25.3.3.1.2.1&.1.3.6.1.2.1.25.3.3.1.2.2:testcom@192.168.17.1:

Target [fw01_cpu]: `/etc/mrtg/fw01-cpu.sh`

あとは mrtg.cfgを 3回実行し、crontabに5分ごとに実行するよう設定をすれば完成です。(実際にはインストール時に /etc/cron.d/mrtg が作成されているので、何もしなくてokだったりますが。)

indexmaker を使って監視対象機器ごとのHTMLファイルにリンクを張ったindex.htmlを作ってもよいのですが、自分は htmlエディタを使ってindex.htmlファイルを作成しました。

随分前に使ったときは、漢字は eucでないと上手く動かない気がしたんですが、いつも間にかそんな制約もなくなったようです。yum でサクッと入れられるし、随分便利になってきましたね。configure; make~ していた頃が懐かしい。