引用 | 編輯
love104
2005-08-05 10:09 |
樓主
▼ |
||
x0
出處:鳥哥的 Linux 新手討論區 http://phorum.vbird.orgmrtg不只可以偵測紀錄本機狀態,也可以用來偵測遠端主機狀態喔!! 主題: MRTG 偵測遠端服務運作狀況, DNS 為例 net-snmp 官網為 http://www.net-snmp.org.tw 1.下載與安裝 net-snmp (舊名為 ucd-snmp) 代碼: $>wgethttp://voxel.dl.sourceforge.net/sourceforge/net-snmp/net-snmp-5.1.2.tar.gz $>./configure --prefix=/usr/local \ --with-sys-contact="abel@localhost" \ --with-sys-location="Taiwan,Tel:123456767" \ --with-mib-modules="misc/ipfwacc mibII host disman/event-mib ucd_snmp agent_mibs agentx notification target utilities host disman/event-mib smux ucd-snmp/diskio tunnel mibII/mta_sendmail " \ --with-sysconfdir="/usr/local/etc/snmp" --enable-shared --with-default-snmp-version=2 $>make $>make install 理論上這些過程應不會碰到任何問題的 (我在 RH 7.3/8.0.9.0 都很順利)若您使用不同的平台, 從官網的 download 去找,幾乎都可以找到,若習慣用 RPM 就下 rpm file 即可(我沒用過),SunOs 就下 SunOS 版的. (上述 mib 可做 remote 的 firewall log 的偵測,主機訊息, CPU,遠端的 sendmail 送件資訊等 ..) configure 我用的參數,您可在 ./configure --help 時得到說明,僅就最重 --with-mib-modules 做些說明,這個意思即是要把某些 mib 功能直接加入 snmp 中,我個人習慣都是在 complier 時就 加進來,不然若要用 snmpd.conf 中的 dlmod (動態配置) 你多少還是得回來重做 module. 對於本主題而言,最重要的是 host 這個 MIBs 一定要載入,這個 MIB(HOST-RESOURCES-MIB) 的主要 功能在提供主機運行的資訊,以下僅列出常用的項目(http://www.net-snmp.org/mibs/host.html): 代碼: hrStorageTable 儲存�]備的資訊,例如 Disk,Memory 等,空間多少,使用了多少 ... hrDeviceTable 週邊資訊,如 CPU/Disk/Ethernet/CDROM ... hrFSTable 硬碟資訊,掛載等 hrSWRunTable 就是你在command mode 下 ps 看到的東西,本主?#125;項目之一 hrSWRunPerfTable 每個 Process CPU/Memory 清單,本主?#125;項目之二 hrSWInstalledTable 本機 RPM 安裝清單 snmpd.conf 設定,精簡版 依本例, snmpd.conf 在 /usr/local/etc/snmp/snmpd.conf , 本檔可以啟動參數 snmpd -c 指定, 內容如下(是的,只要四行就可以了,多寫若不明白用意作用也不大,): 代碼: #定義一像ACL (SECURITY) 的東西,名為 lan, IP 段為 211.72.210/23, Community_string 為 Taiwan com2sec lan 211.72.210.0/23 Taiwan #語法為 group NAME MODEL SECURITY,MODEL 為採用什麼 SNMP 協定版本 group ROGroup v1 lan #語法為 view NAME TYPE SUBTREE [MASK], 這個東西你自己查查,主要通常用 com2sec 等合用 #達到不同的來源,可以存取不同的 OID (MIB) 值,尤其像 ISP ,若客戶租戶線路,他可以單獨提 #供某個 Interface 給他來做 snmp 查詢,本主題意不在此;請自休為重 #此功能在許多 Device Vendor 的 SNMP 功能皆相同 view all included .1 #語法為 access NAME CONTEXT MODEL LEVEL PREFX READ WRITE NOTIFY #NAME: 要對應group 的名稱,為本例使用 v1, #CONTEXT:在 v1 時必為空 (""), #MODEL 在本例需為 v1 或 any(都可以之意) #LEVEL 必為 noauth (無�{證要求, v1 無�{證,我們的�]定只�{ IP 及 Community String) #PREF 我只用過 prefix, 沒試過 extra #R/W/N 字意很明顯,我們只要讀而以,不要求寫及 Trap access ROGroup "" any noauth prefix all none none 其實 SNMP 是很簡單的,一般人通常卡在 snmpd.conf 上,或對 OID/MIB 架構不熟,反把他想的太過複雜 snmpd.conf 中最精華,一般人較難了解處即在 view 及 access 再來,啟動就好: 代碼: $>/usr/local/sbin/snmpd -c /usr/local/etc/snmpd.conf $>cat /var/log/snmpd.log NET-SNMP version 5.1.2 一切正常 . 是的,若您跟我一樣,應不會有問題才是 試運行一下看看: 代碼: $>/usr/local/bin/snmpwalk 211.72.210.251 -c Taiwan -v 1 |more SNMPv2-MIB::sysDescr.0 = STRING: Linux log.mydomain.net 2.4.18-18mppe #1 Sat Dec 7 11:23:44 CET 2002 i686 SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10 DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (267287) 0:44:32.87 SNMPv2-MIB::sysContact.0 = STRING: Root <abel@localhost> SNMPv2-MIB::sysName.0 = STRING: log.mydomain.net SNMPv2-MIB::sysLocation.0 = STRING: Taiwan SNMPv2-MIB::sysORLastChange.0 = Timeticks: (3) 0:00:00.03 SNMPv2-MIB::sysORID.1 = OID: IF-MIB::ifMIB SNMPv2-MIB::sysORID.2 = OID: SNMPv2-MIB::snmpMIB SNMPv2-MIB::sysORID.3 = OID: TCP-MIB::tcpMIB SNMPv2-MIB::sysORID.4 = OID: IP-MIB::ip SNMPv2-MIB::sysORID.5 = OID: UDP-MIB::udpMIB SNMPv2-MIB::sysORID.6 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup SNMPv2-MIB::sysORID.7 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance SNMPv2-MIB::sysORID.8 = OID: SNMP-MPD-MIB::snmpMPDCompliance SNMPv2-MIB::sysORID.9 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance SNMPv2-MIB::sysORID.10 = OID: TUNNEL-MIB::tunnelMIB SNMPv2-MIB::sysORDescr.1 = STRING: The MIB module to describe generic objects for network interface sub-layers SNMPv2-MIB::sysORDescr.2 = STRING: The MIB module for SNMPv2 entities SNMPv2-MIB::sysORDescr.3 = STRING: The MIB module for managing TCP implementations ....以下略 跑起來也正常,請記得,Community_string 本例不為 public, 請知變通 由於我們運行 v1, 所以需以 -v 1 來 walk through . 抓 Process 資料方法 我們先看例子,再來看推演: 代碼: #取得整個 OID Tree (-c Community_String -v snmp_version) $>/usr/local/bin/snmpwalk 211.72.210.251 -c TwNic -v 1 >log.snmp #找出 named PID,得知 named PID 為 10422 (即 Index 值) $>cat log.snmp | grep named HOST-RESOURCES-MIB::hrSWRunName.10422 = STRING: "named" #找出 10422 相關項目 $>cat log.snmp | grep 10422 hrSWRunIndex.10422 = INTEGER: 10422 #Index 可取得所有 PID 值 hrSWRunName.10422 = STRING: "named" #RunName 為此PID 為 named hrSWRunID.10422 = OID: PNNI-MIB::zeroDotZero #沒有作用,並為 PNNI-MIB 項目 hrSWRunPath.10422 = STRING: "named" #帶路徑的全名,本例無,您看看自身例子 hrSWRunParameters.10422 = "" #啟動參數,本例無,例如 -c -g 等參數 hrSWRunType.10422 = INTEGER: application(4) # 4 表應用�{式(application) hrSWRunStatus.10422 = INTEGER: runnable(2) # 2 表休息狀態(Sleep) hrSWRunPerfCPU.10422 = INTEGER: 12063 # CPU 使用時間,單位為百分之一秒 hrSWRunPerfMem.10422 = INTEGER: 2276 KBytes # 佔用記憶體,單位為 KB 個人認為,程度好一點的人看到這裏大概知道怎做下去了,這個功能無法以 mrtg 方式直接 指定 OID 值來做,因為 Index (PID) 為變,所以我們得透過程式來產生 mrtg 資料,假設程式名為 remote_process, 用法為: ./remote_process host community_string process_name 代碼: #!/bin/sh host=$1 community_string=$2 process_name=$3 # 本段在取該主機的描述事項,並轉存成 html 檔,形成之格式如 # sysDescr: Linux ttn239.tnwic.net.tw 2.4.20-8smp #1 SMP Thu Mar 13 17:45:54 EST 2003 i686 # sysObjectID: OID: enterprises.8072.3.2.10 # sysUpTime: Timeticks: (183103803) 21 days, 4:37:18.03 # sysName: ttn239.tnwic.net.tw # sysLocation: TTN info="system.sysDescr.0 system.sysObjectID.0 system.sysUpTime.0 system.sysName.0 system.sysLocation.0" rm -f /www/htdocs/snmp.enum.org.tw/mrtg/${host}_${process_name}.html for mib in $info do name=`echo $mib | cut -f 2 -d'.'` str=`snmpget -v 1 $host -c $community_string $mib | sed -e 's/.*=//g' ` echo "$name: $str<br>" >>/www/htdocs/snmp.enum.org.tw/mrtg/${host}_${process_name}.html done CPU_SUM=0 MEM_SUM=0 #抓取該 Process Name 的所有 PID (即 Index,此時才知 Index 為何) ALL_PID=`snmpwalk -v 1 $host -c $community_string hrSWRunName | grep $process_name | sed -e 's/.*hrSWRunName\.\(.*\) = "\(.*\)"/\1/g'` if [ ${#ALL_PID} -lt 1 ]; then echo "$host 的 $process_name 巳經�}亡了,請儘速處理" | mail abel@mydomain.net #for loop 在於考�{像 http 為有數個 process 等狀況(fork or threads) for PID in $ALL_PID do #取得 CPU 使用時間,單位為 1/100 秒,及記憶體用量,單位為kb RUN_CPU=`snmpwalk $host -c $community_string hrSWRunPerfCPU.$PID|sed -e 's/.*= \(.*\)/\1/g'` RUN_MEM=`snmpwalk $host -c $community_string hrSWRunPerfMem.$PID|sed -e 's/.*= \(.*\) K[Bb].*/\1/g'` #�[總計算 CPU_SUM=`expr $CPU_SUM + $RUN_CPU` MEM_SUM=`expr $MEM_SUM + $RUN_MEM` done #輸出結果 echo $CPU_SUM echo $MEM_SUM 接下來設定 mrtg.cfg (這個 網路上 很多文件可以查,就不解釋了), 代碼: #mrtg.cfg WorkDir: /www/htdocs/snmp.enum.org.tw/mrtg Refresh: 300 Interval: 5 Language: Big5 #perminute 表示要5分鐘中的每分鐘平均,我不要每秒平均,如此數值為過小 Options[_]: growright, noinfo,perminute #------------------------------------------------- #我的�{式,外接三個參數, ./remote_process hostname Community_String Process_name Target[ns11-seednet-named]:`/root/study/remote_process ns11.abc.com.tw Taiwan named` #時間最大為300秒x100 MaxBytes1[ns11-seednet-named]:30000 MaxBytes2[ns11-seednet-named]: 256000 Title[ns11-seednet-named]: ENUM/EPP DNS Server named daemon status Legend1[ns11-seednet-named]: CPU 時間 Legend2[ns11-seednet-named]: MEM 使用 LegendI[ns11-seednet-named]: CPU 時間(秒/分) LegendO[ns11-seednet-named]: MEM 使用(KB) YLegend[ns11-seednet-named]: CPU/MEM usage #這裏我用了一個 html 的 object 語法,以顯示其他系統資訊,如上列"本段在取該主機的描述...內容" PageTop[ns11-seednet-named]: <h1> NS11 DNS Server status </h1> <object data="./ns11_named.html" width=500 height=150 style="border-style:outset; bgcolor:#336699;"> </object> #數值檢查,CPU 時間佔用每分鐘超過10秒要發信警告,MEMORY 佔用超過每分 1000KB �]要警告, # MinO 為小於意思 (亦即 Out 項值小於某數字時) ThreshDir: /www/htdocs/snmp.enum.org.tw/mrtg/alert ThreshMaxI[_]: 1000 ThreshMinI[_]: 1 ThreshMaxO[_]: 1000 # IN 項的外部�{式 # OUT 項的外部�{式 ThreshProgI[ns11-seednet-named]:/www/htdocs/snmp.enum.org.tw/mrtg/alert/mail.sh ThreshProgO[ns11-seednet-named]:/www/htdocs/snmp.enum.org.tw/mrtg/alert/mail.sh -------------------------------------------------------- mail.sh 內容,mrtg 會呼叫這個程式來做 Alert, 參數為 target_name 警告值 現在值: 代碼: #!/bin/sh target=$1 alert_val=$2 curr_val=$3 echo -e "Dear Sir:\n MRTG 發�{監測的系統中 $target 的 $curr_val 超過或小於 $alert_val 您所�]定的警告值,請您了解情況, \nRef:http://xxx.domain.net.tw/mrtg/index.html\n System Admin\n" | /usr/sbin/sendmail -oi abel@localhost 如此即可完成囉... mrtg 不明處請自看 www.mrtg.org , snmpd 要多做才會熟,其他的就靠平時累積實力囉 x0
|
引用 | 編輯
mnbmnb5266
2010-08-25 19:44 |
1樓
▲ |
感謝大大的教學,正在學習中,有些地方不太懂先翻譯一下再說
x0 |