なんだかんだでSNMPに関わりそうになってきたので、
試しに自分の鯖にSNMP(net-snmp 5.5)入れてみたのでメモ。
インストール
yumでインストール
$sudo yum install net-snmp
これでなにやら「snmpconf」snmpd」「snmptrapd」
がインストールされるらしい。
あれ?参考サイトとかに書いてある「snmpwalk」がねぇぞ?
というわけでutilityも入れてみる。
$sudo yum install net-snmp-utils
これで以下のコマンドがインストールされる
$ snmp
snmpbulkget snmpdelta snmpinform snmptable snmptrapd
snmpbulkwalk snmpdf snmpnetstat snmptest snmpusm
snmpconf snmpget snmpset snmptranslate snmpvacm
snmpd snmpgetnext snmpstatus snmptrap snmpwalk
設定ファイルはここにできたらしい。
$ ls /etc/snmp/
snmpd.conf snmptrapd.conf
ちゃんとサービスにも登録されてるらしい。
$ service snmpd status
snmpd is stopped
さっそくデーモン起動
$sudo service snmpd start
Starting snmpd: [ OK ]
初期状態で試してみる、オプションの意味は「-v 1(SNMPv1モード)」「-c public(publicコミュニティ)」
「localhost(エージェント名はlocalhost)」みたい。
$ snmpwalk -v 1 -c public localhost
SNMPv2-MIB::sysDescr.0 = STRING: (バージョン情報)
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (125598) 0:20:55.98
SNMPv2-MIB::sysContact.0 = STRING: Root (configure /etc/snmp/snmp.local.conf)
SNMPv2-MIB::sysName.0 = STRING: (鯖のURI)
SNMPv2-MIB::sysLocation.0 = STRING: Unknown (edit /etc/snmp/snmpd.conf)
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (2) 0:00:00.02
SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDMIBObjects.3.1.1
SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.3 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.5 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.6 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.7 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.8 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORDescr.1 = STRING: The MIB for Message Processing and Dispatching.
SNMPv2-MIB::sysORDescr.2 = STRING: The MIB for Message Processing and Dispatching.
SNMPv2-MIB::sysORDescr.3 = STRING: The SNMP Management Architecture MIB.
SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for SNMPv2 entities
SNMPv2-MIB::sysORDescr.5 = STRING: The MIB module for managing TCP implementations
SNMPv2-MIB::sysORDescr.6 = STRING: The MIB module for managing IP and ICMP implementations
SNMPv2-MIB::sysORDescr.7 = STRING: The MIB module for managing UDP implementations
SNMPv2-MIB::sysORDescr.8 = STRING: View-based Access Control Model for SNMP.
SNMPv2-MIB::sysORUpTime.1 = Timeticks: (2) 0:00:00.02
SNMPv2-MIB::sysORUpTime.2 = Timeticks: (2) 0:00:00.02
SNMPv2-MIB::sysORUpTime.3 = Timeticks: (2) 0:00:00.02
SNMPv2-MIB::sysORUpTime.4 = Timeticks: (2) 0:00:00.02
SNMPv2-MIB::sysORUpTime.5 = Timeticks: (2) 0:00:00.02
SNMPv2-MIB::sysORUpTime.6 = Timeticks: (2) 0:00:00.02
SNMPv2-MIB::sysORUpTime.7 = Timeticks: (2) 0:00:00.02
SNMPv2-MIB::sysORUpTime.8 = Timeticks: (2) 0:00:00.02
HOST-RESOURCES-MIB::hrSystemUptime.0 = Timeticks: (173763490) 20 days, 2:40:34.90
End of MIB
うまくいったらしい、忘れないうちに自動起動の設定
$ chkconfig --list snmpd
snmpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
$ sudo chkconfig snmpd on
$ chkconfig --list snmpd
snmpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
snmpdの設定ファイル(snmpd.conf)を編集
設定ファイルを覗いてみると、だいたいどんなことができるのか書いてあった。
とりあえず幾つかは設定してみる。
Access Control(アクセスコントロール)
「1番目に、コミュニティ名とセキュリティ名を関連付ける」と書いてあるので、
とりあえず「セキュリティ名local(ソースはlocalhost)とコミュニティpublic」を関連付ける。
ネットワークの場合はsourceにネットワークアドレスを設定すりゃいいらしい。
####
# First, map the community name "public" into a "security name"
# sec.name source community
#com2sec notConfigUser default public
com2sec local localhost public
com2sec mynetwork 192.168.0.0/24 public
「2番めに、セキュリティ名をグループ名に挿入する」と書いてある。
「sevurityModel」にはSNMPで用意されているセキュリティモデルを設定するらしい。
「local_group」に「セキュリティモデルv1、セキュリティ名local」「セキュリティモデルv2c、セキュリティ名local」「セキュリティモデルusm、セキュリティ名local」を追加した。
「mynet_group」にも同じように設定。
####
# Second, map the security name into a group name:
# groupName securityModel securityName
#group notConfigGroup v1 notConfigUser
#group notConfigGroup v2c notConfigUser
group local_group v1 local
group local_group v2c local
group local_group usm local
group mynet_group v1 mynetwork
group mynet_group v2c mynetwork
group mynet_group usm mynetwork
「3番目に、ビューを作る」とかいてあるので、
「all_view」というビューにサブツリー「.1(つまり全て)」を「included(追加)」する、マスクはかけない。
####
# Third, create a view for us to let the group have rights to:
# Make at least snmpwalk -v 1 localhost -c public system fast again.
# name incl/excl subtree mask(optional)
#view systemview included .1.3.6.1.2.1.1
#view systemview included .1.3.6.1.2.1.25.1.1
view all_view included .1
「最後に、アクセス権を設定する」とあるので、
グループに対してどのビューを読み込み・書き込み・通知
####
# Finally, grant the group read-only access to the systemview view.
# group context sec.model sec.level prefix read write notif
#access notConfigGroup "" any noauth exact systemview none none
access local_group "" any noauth exact all_view none none
access mynet_group "" any noauth exact all_view none none
とりあえずここらで試してみるために再起動して実行してみると、なんかすごい量の情報が出てくる。
$ sudo service snmpd restart
Stopping snmpd: [ OK ]
Starting snmpd: [ OK ]
$ snmpwalk -v 1 -c public localhost
(省略)
修正前は「systemview」を使って「.1.3.6.1.2.1.1(systemグループ)」と「.1.3.6.1.2.1.25.1.1( hrSystemUptime)」の以下の情報しか見ていなかったが、修正後は「all_view」を使って「.1」以下の情報を表示するようにしたかららしい。
これで上記の設定がうまくいっていることが確認できた。
ちなみに、どんなサブツリーがあるかは
MIBdepotの検索ページをわかるらしいが、そもそも検索キーワドすらわかんないという人はググるといい。
ちなみに規約的には
RFC1213だが、ベンダーが拡張することもできる(1.3.6.1.4系統)のでこれだけ読んだってよくわからないというね・・・
System contact information(コンタクト情報)
システムのコンタクト情報として、設置場所(syslocation)と管理者の連絡先(syscontact)を設定する。
複数設定しても最後に書いた一つしか採用されないらしいので、連絡先はMLとかがいいかも?
# It is also possible to set the sysContact and sysLocation system
# variables through the snmpd.conf file:
#syslocation Unknown (edit /etc/snmp/snmpd.conf)
#syscontact Root (configure /etc/snmp/snmp.local.conf)
syslocation Sakura VPS
syscontact Root
再起動してsnmpwalkするとこんな感じ
ポイント:RFC1213で定義されているものについてはIDではなくオブジェクト名(systemとか)で指定できるらしい。
$ snmpwalk -v 1 -c public localhost system
SNMPv2-MIB::sysDescr.0 = STRING: Linux www8308uf.sakura.ne.jp 3.3.4 #1 SMP Thu May 3 17:49:57 JST 2012 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (447) 0:00:04.47
SNMPv2-MIB::sysContact.0 = STRING: Root
(以下略)
Logging(ログの設定)
(そのうち確認する)
Process checks.(プロセス監視の設定)
とりあえず、今動いているプロセスを見てみる
$ snmpwalk -v2c -c public localhost HOST-RESOURCES-MIB::hrSWRunName
もしくは以下でもOK
$ snmpwalk -v2c -c public localhost 1.3.6.1.2.1.25.4.2.1.2
とりあえず、一旦止めても大丈夫そうなのを探してみる
HOST-RESOURCES-MIB::hrSWRunName.1168 = STRING: "ntpd"
設定ファイルに以下を追加。
ちなみに意味は「プロセスntpdが1個以上2個以下稼働していればOK」
英語でも書かれている通り、「proc ntpd」とすることもできる。
###############################################################################
# Process checks.
#
# The following are examples of how to use the agent to check for
# processes running on the host. The syntax looks something like:
#
# proc NAME [MAX=0] [MIN=0]
#
# NAME: the name of the process to check for. It must match
# exactly (ie, http will not find httpd processes).
# MAX: the maximum number allowed to be running. Defaults to 0.
# MIN: the minimum number to be running. Defaults to 0.
proc ntpd 2 1
確認には「1.3.6.1.4.1.2021.2」を使う
$ snmpwalk -v 1 localhost -c public .1.3.6.1.4.1.2021.2
UCD-SNMP-MIB::prIndex.1 = INTEGER: 1
UCD-SNMP-MIB::prNames.1 = STRING: ntpd
UCD-SNMP-MIB::prMin.1 = INTEGER: 1
UCD-SNMP-MIB::prMax.1 = INTEGER: 2
UCD-SNMP-MIB::prCount.1 = INTEGER: 1
UCD-SNMP-MIB::prErrorFlag.1 = INTEGER: noError(0)
UCD-SNMP-MIB::prErrMessage.1 = STRING:
UCD-SNMP-MIB::prErrFix.1 = INTEGER: noError(0)
UCD-SNMP-MIB::prErrFixCmd.1 = STRING:
さて、止めてみるとどうなるか?
エラーフラグが1になってるね
$ sudo service ntpd stop
Shutting down ntpd: [ OK ]
$ snmpwalk -v2c -c public localhost 1.3.6.1.2.1.25.4.2.1.2 |grep ntpd
$ snmpwalk -v 1 localhost -c public .1.3.6.1.4.1.2021.2
UCD-SNMP-MIB::prIndex.1 = INTEGER: 1
UCD-SNMP-MIB::prNames.1 = STRING: ntpd
UCD-SNMP-MIB::prMin.1 = INTEGER: 1
UCD-SNMP-MIB::prMax.1 = INTEGER: 2
UCD-SNMP-MIB::prCount.1 = INTEGER: 0
UCD-SNMP-MIB::prErrorFlag.1 = INTEGER: error(1)
UCD-SNMP-MIB::prErrMessage.1 = STRING: Too few ntpd running (# = 0)
UCD-SNMP-MIB::prErrFix.1 = INTEGER: noError(0)
UCD-SNMP-MIB::prErrFixCmd.1 = STRING:
ntpdを再起動するとエラーも消えます。
$ sudo service ntpd start
Starting ntpd: [ OK ]
$ snmpwalk -v 1 localhost -c public .1.3.6.1.4.1.2021.2
UCD-SNMP-MIB::prIndex.1 = INTEGER: 1
UCD-SNMP-MIB::prNames.1 = STRING: ntpd
UCD-SNMP-MIB::prMin.1 = INTEGER: 1
UCD-SNMP-MIB::prMax.1 = INTEGER: 2
UCD-SNMP-MIB::prCount.1 = INTEGER: 1
UCD-SNMP-MIB::prErrorFlag.1 = INTEGER: noError(0)
UCD-SNMP-MIB::prErrMessage.1 = STRING:
UCD-SNMP-MIB::prErrFix.1 = INTEGER: noError(0)
UCD-SNMP-MIB::prErrFixCmd.1 = STRING:
Executables/scripts (スクリプト実行)
(そのうちためす)
disk checks (ディスク監視)
ディスクの空き容量などを監視できるらしい。
まずは現在の空き容量を確認してみる。
$ df
Filesystem 1K-ブロック 使用 使用可 使用% マウント位置
/dev/vda3 207098852 12853084 183878224 7% /
tmpfs 1028012 0 1028012 0% /dev/shm
/dev/vda1 262276 97727 151297 40% /boot
とりあえずテストとして、ちょっとでも増えたらエラーになるように設定してみる。
「1.3.6.1.4.1.2021.9」で確認
###############################################################################
# disk checks
#
# The agent can check the amount of available disk space, and make
# sure it is above a set limit.
# disk PATH [MIN=100000]
#
# PATH: mount path to the disk in question.
# MIN: Disks with space below this value will have the Mib's errorFlag set.
# Default value = 100000.
# Check the / partition and make sure it contains at least 10 megs.
#disk / 10000
disk / 183878000
再起動した後、設定が適用されたことを確認
$ sudo service snmpd restart
Stopping snmpd: [ OK ]
Starting snmpd: [ OK ]
$ snmpwalk -v 1 localhost -c public .1.3.6.1.4.1.2021.9
UCD-SNMP-MIB::dskIndex.1 = INTEGER: 1
UCD-SNMP-MIB::dskPath.1 = STRING: /
UCD-SNMP-MIB::dskDevice.1 = STRING: /dev/vda3
UCD-SNMP-MIB::dskMinimum.1 = INTEGER: 183878000
UCD-SNMP-MIB::dskMinPercent.1 = INTEGER: -1
UCD-SNMP-MIB::dskTotal.1 = INTEGER: 207098848
UCD-SNMP-MIB::dskAvail.1 = INTEGER: 183878208
UCD-SNMP-MIB::dskUsed.1 = INTEGER: 12853096
UCD-SNMP-MIB::dskPercent.1 = INTEGER: 7
UCD-SNMP-MIB::dskPercentNode.1 = INTEGER: 1
UCD-SNMP-MIB::dskTotalLow.1 = Gauge32: 207098848
UCD-SNMP-MIB::dskTotalHigh.1 = Gauge32: 0
UCD-SNMP-MIB::dskAvailLow.1 = Gauge32: 183878208
UCD-SNMP-MIB::dskAvailHigh.1 = Gauge32: 0
UCD-SNMP-MIB::dskUsedLow.1 = Gauge32: 12853096
UCD-SNMP-MIB::dskUsedHigh.1 = Gauge32: 0
UCD-SNMP-MIB::dskErrorFlag.1 = INTEGER: noError(0)
UCD-SNMP-MIB::dskErrorMsg.1 = STRING:
とりあえずダミーファイルを作成
$ dd if=/dev/zero of=temp_file bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.00167384 s, 626 MB/s
$ ls -l temp_file
-rw-r--r-- 1 myuser users 1048576 7月 29 17:42 2012 temp_file
確認してみると、たしかにエラーになっている。
$ snmpwalk -v 1 localhost -c public .1.3.6.1.4.1.2021.9
UCD-SNMP-MIB::dskIndex.1 = INTEGER: 1
UCD-SNMP-MIB::dskPath.1 = STRING: /
UCD-SNMP-MIB::dskDevice.1 = STRING: /dev/vda3
UCD-SNMP-MIB::dskMinimum.1 = INTEGER: 183878000
UCD-SNMP-MIB::dskMinPercent.1 = INTEGER: -1
UCD-SNMP-MIB::dskTotal.1 = INTEGER: 207098848
UCD-SNMP-MIB::dskAvail.1 = INTEGER: 183877184
UCD-SNMP-MIB::dskUsed.1 = INTEGER: 12854120
UCD-SNMP-MIB::dskPercent.1 = INTEGER: 7
UCD-SNMP-MIB::dskPercentNode.1 = INTEGER: 1
UCD-SNMP-MIB::dskTotalLow.1 = Gauge32: 207098848
UCD-SNMP-MIB::dskTotalHigh.1 = Gauge32: 0
UCD-SNMP-MIB::dskAvailLow.1 = Gauge32: 183877184
UCD-SNMP-MIB::dskAvailHigh.1 = Gauge32: 0
UCD-SNMP-MIB::dskUsedLow.1 = Gauge32: 12854120
UCD-SNMP-MIB::dskUsedHigh.1 = Gauge32: 0
UCD-SNMP-MIB::dskErrorFlag.1 = INTEGER: error(1)
UCD-SNMP-MIB::dskErrorMsg.1 = STRING: /: less than 183878000 free (= 183877184)
load average checks(ロードアベレージの監視)
ロードアベレージを監視して、一定以上になるとエラーにするように出来る。
でもわが鯖はこき使う前提なので特に設定しない。
Extensible sections(拡張セクション)
(そのうちためす)
Pass through control.
(そのうちためす)