顯示具有 SNMP 標籤的文章。 顯示所有文章
顯示具有 SNMP 標籤的文章。 顯示所有文章

SNMP on LINUX server 之 exec 自訂訊息實作

之前我們講到用 snmpd 裡面的 proc + 服務名稱來監視特定的服務狀態,但這只對部分的服務有效,例如 ntpd, snmpd, nfsd, httpd...等等,我不太確定他的抓取方式,但似乎,用 ps 去看如果 process name 沒出現在最前面的,似乎 snmpd 就 monitor 不到,這種狀況像 Tomcat 就會出現。舉例來說,我有個服務是用到 java 去帶起來的,如下面所示:
[root@KHXAAAS1 ~]# ps -aef|grep AAA|grep -v AAA
root 19475 1 0 09:13 ? 00:00:11 java -Xmx512m -Daaa.base=/opt/AAA -Daaa.run=/opt/AAA/run -Daaa.bin=/opt/AAA/bin -Daaa.lib=/opt/AAA/lib -Daaa.jni=/opt/AAA/jni com.lucent.aaa.gui.ServerManagementTool -debug info
root 21631 1 0 Sep12 ? 00:01:39 java -Daaa.base=/opt/AAA -Daaa.run=/opt/AAA/run -Daaa.bin=/opt/AAA/bin -Daaa.lib=/opt/AAA/lib -Daaa.jni=/opt/AAA/jni com.lucent.aaa.ConfigServer
root 26302 1 0 09:41 pts/0 00:00:08 java -Xmx512m -server -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -Dsun.rmi.dgc.server.gcInterval=0x7FFFFFFFFFFFFFFE -Dsun.rmi.dgc.client.gcInterval=0x7FFFFFFFFFFFFFFE -Daaa.base=/opt/AAA -Daaa.run=/opt/AAA/run -Daaa.bin=/opt/AAA/bin -Daaa.lib=/opt/AAA/lib -Daaa.jni=/opt/AAA/jni com.lucent.aaa.PolicyServer -debug debug
但用 snmpd 去監控 proc AAA 的話,一定看不到東西,(雖然可以用 proc Java 的方式來 monitor,但畢竟用 Java 帶起來的服務越來越多,這樣並不容易區分,容易造成誤判。)這個時候就可以用一個變通的方式來 monitor 我們要的服務狀態,那就是 exec 這個 snmpd.conf 裡的 option,他的用法是:
Usage:
exec MIBOID EXEC-COMMAND
我們直接實作一下好了。

首先假設我們有一個如前面說的服務用 proc AAA 方式加到 /etc/snmp/snmpd.conf 裡面卻無法正常 monitor 到服務的狀態時,而且假設,我們有一個簡單的判斷服務正常啟動的方法時(通常是像我們這裡示範的這種,灌了一個某某廠商的軟體時,想改變他的啟動方式或參數又無從改起時),如下所示,今天的實作目標有兩台 AAA server,上面有兩個主要的 process 要檢查狀態,
其中一個是 Policy server 另一個是 Configuration server,為了待會兒的測試,我先將其中第一台 KHXAAAS1 的 Policy server 先停掉,第二台 KHXAAAS2 的服務全部都讓他正常帶起來:
[root@KHXAAAS1 ~]# /opt/AAA/bin/aaa list all
The server could not be reached: Connection refused
8950 AAA Policy Server: not responding
101 Server active
8950 AAA Configuration Server: responding
[root@KHXAAAS2 ~]# /opt/AAA/bin/aaa list all
101 Server active
8950 AAA Policy Server: responding
101 Server active
8950 AAA Configuration Server: responding
說簡單點,/etc/snmpd/snmpd.conf 裡的 exec 這個 option 其實就是宣告一個 OID,然後當 SNMP server query 到這個 OID 時,就去執行指定的 shell scrpit 然後將直塞回剛剛指定的 OID.101.x 裡面去。接下來我們直接做一個簡單示範:

首先我們先 vi /etc/snmp/snmpd.conf(或用下面的 echo 指令也行)在裡面新加上一行如下的格式:
[root@KHXAAAS1 ~]# echo "exec .1.3.6.1.4.1.2021.51 ApplicationStatusQury /bin/sh /bin/ASQ.sh" >> /etc/snmp/snmpd.conf
檢查一下確實寫進去了:
[root@KHXAAAS1 ~]# grep ApplicationStatusQury /etc/snmp/snmpd.conf
exec .1.3.6.1.4.1.2021.51 ApplicationStatusQury /bin/sh /bin/ASQ.sh
接著我們編輯一個簡單的 shell script 叫 /bin/ASQ-AAA.sh 用來檢查 Policy server 和 Configuration server 的狀態,寫到 /opt/.ASQ-AAA-Policy.prState 與 /opt/.ASQ-AAA-Config.prState 裡面(這裡我先定義一下,如果這個file裡面的值是 responding 代表 服務正常,如果是 not responding 的話,代表服務掛點了,當然也可以用 wc -l 去讓這個 fiie 帶的值為 0 或 1 ):
[root@KHXAAAS1 ~]# cat /bin/ASQ-AAA.sh
#!/bin/sh
/opt/AAA/bin/aaa list policy > /opt/.ASQ-AAA-Policy.prState1
cat /opt/.ASQ-AAA-Policy.prState1|cut -d ":" -f2 > /opt/.ASQ-AAA-Policy.prState2
#grep 'not responding' /opt/.ASQ-AAA-Policy.prState1|wc -l > /opt/.ASQ-AAA-Policy.prState2

/opt/AAA/bin/aaa list config > /opt/.ASQ-AAA-Config.prState1
cat /opt/.ASQ-AAA-Config.prState1|cut -d ":" -f2 > /opt/.ASQ-AAA-Config.prState2
#grep 'not responding' /opt/.ASQ-AAA-Config.prState1|wc -l > /opt/.ASQ-AAA-Config.prState2
exit
然後我們再寫個 /bin/ASQ-AAA.sh 用來檢查 /opt/.ASQ-AAA-Policy.prState2 與 /opt/.ASQ-AAA-Config.prState2 裡面的值,分別寫進 1.3.6.1.4.1.2021.51.101.1 與 1.3.6.1.4.1.2021.51.101.2 這兩個 OID 去,如果你在剛剛的 schipt 裡面有 3 個 output,那就會還有 1.3.6.1.4.1.2021.51.101.3 這個 OID,依此類推...
[root@KHXAAAS1 ~]# cat /bin/ASQ.sh
#!/bin/sh
echo `cat /opt/.ASQ-AAA-Policy.prState2`
echo `cat /opt/.ASQ-AAA-Config.prState2`
exit
接著用 crontab -e 把他加進 cron job 去吧,這裡我們讓他每兩分鐘執行一次 Application Status Qury 的 script,可自行更改。
[root@KHXAAAS1 ~]# crontab -l
*/2 * * * * /bin/PSQ-AAA.sh
剛剛改完 /etc/snmp/snmpd.conf 之後我們還沒重起 snmpd 的服務,所以現在去查詢 .1.3.6.1.4.1.2021.51 這個 OID 應該會得倒下面的回應:
[root@KHXAAAS1 ~]# snmpwalk -v 2c -c public localhost .1.3.6.1.4.1.2021.51
UCD-SNMP-MIB::ucdavis.51 = No Such Object available on this agent at this OID
再來要開始驗證了,先確定一下兩台 AAA server 上的服務是把第一台的 Policy server 停下來的狀態,第二台則是保持 service 正常:
[root@KHXAAAS1 ~]# /opt/AAA/bin/aaa list all
The server could not be reached: Connection refused
8950 AAA Policy Server: not responding
101 Server active
8950 AAA Configuration Server: responding
[root@KHXAAAS2 ~]# /opt/AAA/bin/aaa list all
101 Server active
8950 AAA Policy Server: responding
101 Server active
8950 AAA Configuration Server: responding
接下來先重啟一下 snmpd service 來讓剛剛我們改的部分生效:
[root@KHXAAAS1 ~]# service snmpd restart
Stopping snmpd: [ OK ]
Starting snmpd: [ OK ]
好啦,現在可以查詢看看囉,先在本機上查詢一下(當然你也可以從你的 SNMP server 端來查詢) 我們剛剛新定義的 OID:
[root@KHXAAAS1 ~]# snmpwalk -v 2c -c public localhost .1.3.6.1.4.1.2021.51
UCD-SNMP-MIB::ucdavis.51.1.1 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.51.2.1 = STRING: "ApplicationStatusQury"
UCD-SNMP-MIB::ucdavis.51.3.1 = STRING: "/bin/sh /bin/ASQ.sh"
UCD-SNMP-MIB::ucdavis.51.100.1 = INTEGER: 0
UCD-SNMP-MIB::ucdavis.51.101.1 = STRING: "not responding"
UCD-SNMP-MIB::ucdavis.51.101.2 = STRING: "responding"
UCD-SNMP-MIB::ucdavis.51.102.1 = INTEGER: 0
UCD-SNMP-MIB::ucdavis.51.103.1 = ""
如果是用 wc -l 去 count 的話那應該會像下面這樣:
UCD-SNMP-MIB::ucdavis.51.101.1 = STRING: "1"
UCD-SNMP-MIB::ucdavis.51.101.2 = STRING: "0"
當然在這裡我們需要的是 .1.3.6.1.4.1.2021.51.101.1 and .1.3.6.1.4.1.2021.51.101.2 這兩個 OID,對應到 Policy server 和 Configuration server 的服務狀態。所以由 SNMP server 端就可以直接設定一個 Passive Monitor 來 Polling 這兩個 OID 的值。
[root@KHXEMSS1 ~]# snmpwalk -v 2c -c public khxaaas1 .1.3.6.1.4.1.2021.51.101.1
UCD-SNMP-MIB::ucdavis.51.101.1 = STRING: "not responding"
[root@KHXEMSS1 ~]# snmpwalk -v 2c -c public khxaaas1 .1.3.6.1.4.1.2021.51.101.2
UCD-SNMP-MIB::ucdavis.51.101.2 = STRING: "responding"
[root@KHXEMSS1 ~]# snmpwalk -v 2c -c public khxaaas2 .1.3.6.1.4.1.2021.51.101.1
UCD-SNMP-MIB::ucdavis.51.101.1 = STRING: "responding"
[root@KHXEMSS1 ~]# snmpwalk -v 2c -c public khxaaas2 .1.3.6.1.4.1.2021.51.101.2
UCD-SNMP-MIB::ucdavis.51.101.2 = STRING: "responding"
所以上面就代表第一台 KHXAAAS1 的 Policy server 有問題。OK...報告完畢。
(詳全文...)

SNMP 匯入新 MIB on LINUX server

這次我們要測試的機器仍然是 RHEL ES4U6 的環境,已經裝好相關的 net-snmp (net-snmp-5.1.2-11.EL4.11) 程式,下面列出測試要匯入的為 RADIUS 相關的幾個 MIB 檔:
RADIUS-AUTH-SERVER-MIB.txt
RADIUS-AUTH-CLIENT-MIB.txt
RADIUS-ACC-SERVER-MIB.txt
RADIUS-ACC-CLIENT-MIB.txt
RADIUS-DYNAUTH-SERVER-MIB.txt
RADIUS-DYNAUTH-CLIENT-MIB.txt
先用 snmptranslate 來確認一下 snmpd 是否可以認得我們要匯入的 OBJECT-TYPE 與 OID:
[root@KHXAAAS2 mibs]# snmptranslate -On -IR radiusAuthServMIBCompliance
Unknown object identifier: radiusAuthServMIBCompliance
[root@KHXAAAS2 mibs]# snmptranslate -Td .1.3.6.1.2.1.67.1.1.2.1.1
SNMPv2-SMI::mib-2.67.1.1.2.1.1
mib-2 OBJECT-TYPE
-- FROM SNMPv2-SMI, RFC1213-MIB
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) 67 1 1 2 1 1 }
看起來目前是翻譯不出我們所要查 RADIUS 相關的 OBJECT-TYPE 與 OID,好了,接下來就是這次的工作囉:

首先,我們將 RADIUS 這幾個 MIB 檔複製到 /usr/share/snmp/mibs 底下:
[root@KHXAAAS2 ~] mkdir -p $HOME/.snmp
[root@KHXAAAS2 ~] cp -p /tmp/RADIUS* /usr/share/snmp/mibs/
接著就是告訴 snmpd 去 load 這些 MIB:

有兩種方式,暫時測試可用第一種方法,只對目前的 session 有效:
[root@KHXAAAS2 ~] export MIBS=+MY-MIB
或者是第二種方法:
[root@KHXAAAS2 ~] echo "mibs +RADIUS-AUTH-SERVER-MIB" >> $HOME/.snmp/snmp.conf
[root@KHXAAAS2 ~] echo "mibs +RADIUS-AUTH-CLIENT-MIB" >> $HOME/.snmp/snmp.conf
[root@KHXAAAS2 ~] echo "mibs +RADIUS-ACC-SERVER-MIB" >> $HOME/.snmp/snmp.conf
[root@KHXAAAS2 ~] echo "mibs +RADIUS-ACC-CLIENT-MIB" >> $HOME/.snmp/snmp.conf
[root@KHXAAAS2 ~] echo "mibs +RADIUS-DYNAUTH-SERVER-MIB" >> $HOME/.snmp/snmp.conf
[root@KHXAAAS2 ~] echo "mibs +RADIUS-DYNAUTH-CLIENT-MIB" >> $HOME/.snmp/snmp.conf
or
[root@KHXAAAS2 ~] echo "mibs +ALL" >> $HOME/.snmp/snmp.conf
也是可以,用 ALL 會把所有可用的 MIB 都 LOAD 進來,當然包括剛剛的幾個測試 MIB 檔,不過速度上會比較慢喔。(注意喔,如果是用
echo "mibs +RADIUS-DYNAUTH-CLIENT-MIB" 的方式,要記得把後面的 .txt 去掉喔~)

好了,先看一下 MIBDIR 的目錄下有些什麼囉:
[root@KHXAAAS2 mibs]# pwd
/usr/share/snmp/mibs
[root@KHXAAAS2 mibs]# ls -alrt
total 1740
-rw-r--r-- 1 root root 38034 Jul 19 2007 SNMPv2-TC.txt
-rw-r--r-- 1 root root 8924 Jul 19 2007 SNMPv2-SMI.txt
-rw-r--r-- 1 root root 29305 Jul 19 2007 SNMPv2-MIB.txt
-rw-r--r-- 1 root root 8263 Jul 19 2007 SNMPv2-CONF.txt
-rw-r--r-- 1 root root 9106 Jul 19 2007 SNMP-PROXY-MIB.txt
-rw-r--r-- 1 root root 1174 Jul 19 2007 RFC-1215.txt
-rw-r--r-- 1 root root 79667 Jul 19 2007 RFC1213-MIB.txt
-rw-r--r-- 1 root root 3067 Jul 19 2007 RFC1155-SMI.txt
-rw-r--r-- 1 root root 71691 Jul 19 2007 IF-MIB.txt
-rw-r--r-- 1 root root 5066 Jul 19 2007 IF-INVERTED-STACK-MIB.txt
-rw-r--r-- 1 root root 84492 Jul 19 2007 EtherLike-MIB.txt
-rw-r--r-- 1 root root 4076 Jul 19 2007 UDP-MIB.txt
-rw-r--r-- 1 root root 10765 Jul 19 2007 TCP-MIB.txt
-rw-r--r-- 1 root root 2205 Jul 19 2007 SNMP-USM-AES-MIB.txt
-rw-r--r-- 1 root root 147822 Jul 19 2007 RMON-MIB.txt
-rw-r--r-- 1 root root 24723 Jul 19 2007 NOTIFICATION-LOG-MIB.txt
-rw-r--r-- 1 root root 4400 Jul 19 2007 IPV6-UDP-MIB.txt
-rw-r--r-- 1 root root 2367 Jul 19 2007 IPV6-TC.txt
-rw-r--r-- 1 root root 7257 Jul 19 2007 IPV6-TCP-MIB.txt
-rw-r--r-- 1 root root 48703 Jul 19 2007 IPV6-MIB.txt
-rw-r--r-- 1 root root 15936 Jul 19 2007 IPV6-ICMP-MIB.txt
-rw-r--r-- 1 root root 23499 Jul 19 2007 IP-MIB.txt
-rw-r--r-- 1 root root 26781 Jul 19 2007 IP-FORWARD-MIB.txt
-rw-r--r-- 1 root root 12517 Jul 19 2007 INET-ADDRESS-MIB.txt
-rw-r--r-- 1 root root 4660 Jul 19 2007 HCNUM-TC.txt
-rw-r--r-- 1 root root 64311 Jul 19 2007 DISMAN-SCRIPT-MIB.txt
-rw-r--r-- 1 root root 24613 Jul 19 2007 DISMAN-SCHEDULE-MIB.txt
-rw-r--r-- 1 root root 17455 Jul 19 2007 AGENTX-MIB.txt
-rw-r--r-- 1 root root 35242 Jul 19 2007 UCD-SNMP-MIB.txt
-rw-r--r-- 1 root root 8118 Jul 19 2007 UCD-IPFWACC-MIB.txt
-rw-r--r-- 1 root root 2163 Jul 19 2007 UCD-DEMO-MIB.txt
-rw-r--r-- 1 root root 22769 Jul 19 2007 SNMP-TARGET-MIB.txt
-rw-r--r-- 1 root root 4628 Jul 19 2007 SMUX-MIB.txt
-rw-r--r-- 1 root root 4318 Jul 19 2007 NET-SNMP-TC.txt
-rw-r--r-- 1 root root 2036 Jul 19 2007 NET-SNMP-MIB.txt
-rw-r--r-- 1 root root 6741 Jul 19 2007 NET-SNMP-EXAMPLES-MIB.txt
-rw-r--r-- 1 root root 15650 Jul 19 2007 NET-SNMP-AGENT-MIB.txt
-rw-r--r-- 1 root root 4299 Jul 19 2007 IANA-LANGUAGE-MIB.txt
-rw-r--r-- 1 root root 20126 Jul 19 2007 IANAifType-MIB.txt
-rw-r--r-- 1 root root 4743 Jul 19 2007 IANA-ADDRESS-FAMILY-NUMBERS-MIB.txt
-rw-r--r-- 1 root root 10583 Jul 19 2007 HOST-RESOURCES-TYPES.txt
-rw-r--r-- 1 root root 52544 Jul 19 2007 HOST-RESOURCES-MIB.txt
-rw-r--r-- 1 root root 3010 Jul 19 2007 UCD-DLMOD-MIB.txt
-rw-r--r-- 1 root root 3198 Jul 19 2007 UCD-DISKIO-MIB.txt
-rw-r--r-- 1 root root 34162 Jul 19 2007 SNMP-VIEW-BASED-ACM-MIB.txt
-rw-r--r-- 1 root root 5775 Jul 19 2007 SNMPv2-TM.txt
-rw-r--r-- 1 root root 39201 Jul 19 2007 SNMP-USER-BASED-SM-MIB.txt
-rw-r--r-- 1 root root 20014 Jul 19 2007 SNMP-NOTIFICATION-MIB.txt
-rw-r--r-- 1 root root 5496 Jul 19 2007 SNMP-MPD-MIB.txt
-rw-r--r-- 1 root root 22342 Jul 19 2007 SNMP-FRAMEWORK-MIB.txt
-rw-r--r-- 1 root root 15490 Jul 19 2007 SNMP-COMMUNITY-MIB.txt
-rw-r--r-- 1 root root 5931 Jul 19 2007 LM-SENSORS-MIB.txt
-rw-r--r-- 1 root root 68177 Jul 19 2007 DISMAN-EVENT-MIB.txt
drwxr-xr-x 4 root root 4096 Jun 12 04:28 ..
-rw-rw---- 1 root root 28446 Aug 29 00:32 RADIUS-AUTH-SERVER-MIB.txt
-rw-rw---- 1 root root 26373 Aug 29 00:32 RADIUS-AUTH-CLIENT-MIB.txt
-rw-rw---- 1 root root 26281 Aug 29 00:32 RADIUS-ACC-SERVER-MIB.txt
-rw-rw---- 1 root root 23747 Aug 29 00:32 RADIUS-ACC-CLIENT-MIB.txt
-rw-rw---- 1 root root 29247 Aug 29 00:32 RADIUS-DYNAUTH-SERVER-MIB.txt
-rw-rw---- 1 root root 31892 Aug 29 00:32 RADIUS-DYNAUTH-CLIENT-MIB.txt
drwxr-xr-x 2 root root 4096 Oct 2 10:16 .
-rw-r--r-- 1 root root 2058 Oct 2 10:16 .index
不用重起 snmpd 的服務,我們直接再查詢一次試試看:

[root@KHXAAAS2 mibs]# snmptranslate -On -IR radiusAuthServMIBCompliance
.1.3.6.1.2.1.67.1.1.2.1.1
[root@KHXAAAS2 mibs]# snmptranslate -Td .1.3.6.1.2.1.67.1.1.2.1.1
RADIUS-AUTH-SERVER-MIB::radiusAuthServMIBCompliance
radiusAuthServMIBCompliance MODULE-COMPLIANCE
-- FROM RADIUS-AUTH-SERVER-MIB
DESCRIPTION "The compliance statement for authentication
servers implementing the RADIUS Authentication
Server MIB. Implementation of this module is for
IPv4-only entities, or for backwards compatibility
use with entities that support both IPv4 and
IPv6."
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) radiusMIB(67) radiusAuthentication(1) radiusAuthServMIB(1) radiusAuthServMIBConformance(2) radiusAuthServMIBCompliances(1) 1 }
果然就可以查詢的到 RADIUS 的 OBJECT-TYPE 與 OID 囉...

參考資料:Net-SNMP FAQ How do I add a MIB
(詳全文...)