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

                                By 洋蔥爸比 Tosian Yang

之前我們講到用 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: [ ]
Starting snmpd: [ ]

好啦,現在可以查詢看看囉,先在本機上查詢一下(當然你也可以從你的 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…報告完畢。

Measure
Measure
 
 

Read more

How to document Home Lab and Network

運維機房和跨域的網路,會遇到各式需求與問題,用對工具才能分析問題,個人覺得最重要的是使用能處理問題的工具。 推薦目前想學和正在使用的平台與軟體,協助將公司/家用機房文件化 佈告欄任務管理 Focalboard 白板可管理任務指派 網路架構文件編寫 netbox 精細管理網路設備與連接線路 IP 資源管理 phpipam 專注網路IP分配 邏輯塊文件編寫 draw.io 視覺化概念圖 機房設備管理 ITDB 管理設備生命週期與使用者

By Phillips Hsieh

如何在Raspberry Pi4上安裝Proxmox for ARM64

第一步 準備好Raspberry Pi 4 / CM4 4GB RAM,這裡要留意CM4如果是買有內建eMMC storage會限制不能使用SD卡開機而限制本地空間容量,如果沒有NAS外接空間或使用USB開機的話,建議買CM4 Lite插上大容量SD卡 第二步 去Armbian官網下載最小化Debian bookworm image https://www.armbian.com/rpi4b/ Armbian 25.2.2 Bookworm Minimal / IOT 然後寫入SD/USB開機碟,寫入方法參考官方文件 https://github.com/raspberrypi/usbboot/blob/master/Readme.md Note: 官方提供的預先設定系統方法,可以在Armbian初次啟動自動化完成系統設定。連結在此 https://docs.armbian.com/User-Guide_Autoconfig/

By Phillips Hsieh

世界越快心越慢

在晚飯後的休息時間,我特別享受在客廳瀏灠youtube上各樣各式創作者的影音作品。很大不同於傳統媒體,節目多是針對大多數族群喜好挑選的,在youtube上我會依心情看無腦的動畫、一些旅拍記錄、新聞時事談論。 尤其在看了大量的Youtube的分享後,我真的感受到會限制我的是我的無知,特別是那些我想都沒想過的實際應用,在學習後大大幫助到我的生活和工作層面。 休息在家時,我喜歡想一些沒做過的菜,動手去設計生活和工作上的解決方案,自己是真的很難閒著沒事做。 如創作文章,陪養新的習慣都能感覺到成長的喜悅,是不同於吃喝玩樂的快樂的。 創作不去限制固定的形式,文字是創作、影像聲音也是創作,記錄生活也是創作,我想留下的就是創造—》實現—》回憶,這樣子的循環過程,在留下的足跡面看到自己一路上的成長、失敗、絕望、重新再來。 雖然大部份的時候去做這些創作也不明白有什麼特別的意義,但不去做也不會留下什麼,所以呀不如反事都去試試看,也許能有不一樣的水花也許有意想不到的結果,投資自己永遠不會是失敗的決定,不是嗎?先問問自己再開始計畫下一步,未來沒人說得準。 像最近看youtube仍大一群人在為DOS開

By Phillips Hsieh

知識管理的三個步驟:一小時學會把知識運用到生活上

摘錄瓦基「閱讀前哨站」文章作為自己學習知識管理的內容 Part1「篩選資訊」 如何從海量資訊中篩選出啟發性、實用性和相關性的精華,讓你在學習過程中不再迷失方向。 1. 實用性 2. 啟發性 Part2「提高理解」 如何通過譬喻法和應用法,將抽象的知識與日常生活和工作緊密結合,建立更深刻的理解。 1. 應用法 2. 譬喻法 Part3「運用知識」 如何連結既有知識,跟自己感興趣的領域和專案產生關聯,讓你在運用知識的路途上游刃有餘。 1. 跟日常工作專案、人際活動產生連結 # 為什麼要寫日記? * 寫日記是為了忘記,忘卻瑣碎事情,保持專注力 * 寫日記就像在翻譯這個世界,訓練自己的解讀能力 * 不只是透過日記來記錄生活,而是透過日記來發展生活 #如何寫日記? * 不要寫流水帳式的日記,而是寫覆盤式的日記 當我們試著記錄活動和感受之間的關聯,有助於辦認出真正快樂的事 日記的記錄方式要以過程為主,而非結果 * 感恩日記的科學建議,每日感恩的案例

By Phillips Hsieh