前言:
其實這個題目我寫的有點心虛,因為我對librenms其實不太熟...之前裝librenms就是裝好能用,然後定期更新而已。
直到這一次公司買了新的設備 Ericsson SSR 8010。librenms內建的模組沒有辦法抓到它記憶體使用量及風扇轉速,因此我只好以『自己』的方式來處理。如果有觀念錯誤的地方煩請指正或指點。
以下切入正題:
重要觀念:
在librenms要新增資料,有兩種方式:dicovery、poller。這兩者以我的認知而言,doscovery用在第一次新增裝置或之後設定rediscovery時使用,而poller則是用在設備上線後的維運。但以我這一次維護而言,mempools及storage在discovery及poller都要設定。但fanspeed及temperature只需要設定discovery...我也不知道為什麼。也許之後有機會再研究。
關於除錯:
先講除錯的部份,如果我們不曉得怎麼去看程式的輸出就無法除錯。因此除錯的部份是最重要的。
以discovery而言:
cd /opt/librenms
./discovery.php -h 74 -d -m mempools
以poller而言:
./poller.php -h 74 -d -m mempools
-h指的是設備編號,在設備的連結可以看出來。
-d代表debug,但資訊太多。我覺得不是很好用。
-m指的是要看的模組,如果指定的話比較不會被一堆資訊蓋掉。
當然,你也可以在設備的設定介面,在modules這邊把不需要的關閉。但關閉的時候要小心,我不曉得關到哪一個把網路介面給關掉,找不到解法,最後只好把設備刪除再重新新增一次。
設備的預先定義在:
/opt/librenms/includes/definitions
檔名為seos.yaml,
內容如下:os: seos
text: 'Redback Networks SmartEdge'
type: network
icon: ericsson
mib_dir:
- ericsson
discovery:
- sysObjectID:
- .1.3.6.1.4.1.2352.1
bad_iftype:
- l2vlan
- softwareLoopback
我只有新增bad_iftype的部份,把vlan及loopback IP加入,讓它不去爬流量。
mempools:
接著我們講怎麼抓記憶體的資訊,先切換至
/opt/librenms/includes/discovery/mempools
新增seos.inc.php這個檔案:
<?php
if ($device['os'] == 'seos') {
echo 'SmartEdge(SSR): ';
$used = snmp_get($device, '.1.3.6.1.4.1.2352.2.16.1.2.1.4.1', '-OvQ');
$free = snmp_get($device, '.1.3.6.1.4.1.2352.2.16.1.2.1.3.1', '-OvQ');
$used = $used*1024;
$free = $free*1024;
$total = ($free + $used);
$percent = ($used / $total * 100);
//echo "used:$used free:$free :total:$total percent:$percent";
if (is_numeric($total) && is_numeric($used)) {
discover_mempool($valid_mempool, $device, 0, 'seos', 'Memory', '1', null, null);
}
}
我參考的是f5.inc.php這個檔案,將其複製後再加以修改而成。*1024的目的是因為它輸出的是KB。
在測試的時候。可以把echo那一行的註解拿掉,觀察其輸出是不是跟我們想像的一樣:
我們回到/opt/librenms,並執行:
./discovery.php -h 74 -m mempools
#### Load disco module mempools ####
FORTIAUTHENTICATOR-MEMORY-POOL: FORTISANDBOX-MEMORY-POOL: SmartEdge(SSR): used:1084664000 free:48010928000 :total:49095592000 percent:2.2092899908407.
>> Runtime for discovery module 'mempools': 0.1420 seconds with 86408 bytes
>> SNMP: [9/0.13s] MySQL: [2/0.00s] RRD: [0/0.00s]
#### Unload disco module mempools ####
檢查一下輸出的部份是不是都有我們預期的數字 格式正不正確,接著我們把echo該行加上註解,再重新執行一次:
./discovery.php -h 74 -m mempools
可以看到這一段,(MIB檔名顯示有誤但不影響)
#### Load disco module mempools ####
FORTIAUTHENTICATOR-MEMORY-POOL: FORTISANDBOX-MEMORY-POOL: SmartEdge(SSR): .
可以看到紅色的一點,如果是+號代表新增,如果是U代表update,.就猜不出來了,猜想是沒有變化。接著我們要到poller去做一次類似的事,
目錄在:
/opt/librenms/includes/polling/mempools
seos.inc.php的內容如下:
<?php
// Simple hard-coded poller for SmartEdge
echo 'SmartEdge(SSR) MemPool'.'\n';
$used = snmp_get($device, '.1.3.6.1.4.1.2352.2.16.1.2.1.4.1', '-OvQ');
$user = $used * 1024;
$free = snmp_get($device, '.1.3.6.1.4.1.2352.2.16.1.2.1.3.1', '-OvQ');
$free = $free * 1024;
$mempool['total'] = ($free + $used);
$mempool['free'] = $free;
$mempool['used'] = $used;
這個程式很簡單,由於輸出是KB,因此我也乘以1024。
其它的部份,包含storage、fanspeed及temperature相差不多。注意一下所在的目錄(環境類的會收在sensors這個目錄),還有要參考的檔案就好了。感覺是不用特別示範。我覺得比較有趣的是temperature,它的SNMP輸出是這樣:
iso.3.6.1.4.1.2352.2.4.1.5.1.2.1.1 = STRING: "Fan unit 1 on slot FT1"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.1.2 = STRING: "Fan unit 2 on slot FT1"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.1.3 = STRING: "Fan unit 3 on slot FT1"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.1.4 = STRING: "Fan unit 4 on slot FT1"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.1.5 = STRING: "Fan unit 5 on slot FT1"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.1.6 = STRING: "Fan unit 6 on slot FT1"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.2.1 = STRING: "Fan unit 1 on slot FT2"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.2.2 = STRING: "Fan unit 2 on slot FT2"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.2.3 = STRING: "Fan unit 3 on slot FT2"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.2.4 = STRING: "Fan unit 4 on slot FT2"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.2.5 = STRING: "Fan unit 5 on slot FT2"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.2.6 = STRING: "Fan unit 6 on slot FT2"
它有兩層,(1.1~1.6還有2.1~2.6),要想辦法把它塞在同一個array,再一次輸出。我是用土砲硬幹的方式做的,一定有更有趣的方法。也許有空再來玩。
這一些檔案我都放在我的github上。
https://github.com/tiserle/librenms-seos
有需要的話可以上來參考。但硬幹的部份笑笑就好。
另外我不太會操作github,所以如果用起來很奇怪請忽略...
網誌管理員已經移除這則留言。
回覆刪除好文!
回覆刪除感謝節省大大 :)
刪除請問librenms怎麼收機房溫度呢?
回覆刪除這個問題要看你們機房有什麼設備,一般機房可能會有PLC,可以即時抓到溫度感應器的問題。如果沒有的話,可以抓你們設備的進風口的溫度,這個溫度一般會很接近機房溫度。如果有好幾台的話,可以把他們的進風口溫度做平均計算,會更接近機房的溫度。
刪除謝謝大大的回覆,我是有一個設備用來監控溫度,這個設備上面也有snmp,我也設定了,但到了librenms上卻沒有抓到溫度值?不知要怎麼查?
刪除https://docs.librenms.org/Support/Adding-a-Device/
刪除一樣是新增一個device,如果這個device有既有的mib檔(mib檔中也有溫度的資訊),就會抓到它的溫度。
如果沒有既有的mib檔就比較麻煩,要像我一樣自己想辦法做出來。
我在temperature資料夾新增了一個eltek.inc.php,再執行./discovery.php -h 20 -m sensors,有抓到溫度,但在執行discover_sensor,卻出現下面的錯誤:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)' at line 1 (Connection: mysql, SQL: INSERT IGNORE INTO `sensors` (`poller_type`,`sensor_class`,`device_id`,`sensor_oid`,`sensor_index`,`sensor_type`,`sensor_descr`,`sensor_divisor`,`sensor_multiplier`,`sensor_limit`,`sensor_limit_warn`,`sensor_limit_low`,`sensor_limit_low_warn`,`sensor_current`,`entPhysicalIndex`,`entPhysicalIndex_measured`,`user_func`,`group`,`rrd_type`) VALUES (snmp,temperature,20,,0,temperatureRadio,Internal Temp,1,1,38.8,38.8_warn,38.8_low,38.8_low_warn,18.8,,_measured,,,GAUGE)) (Connection: dbFacile, SQL: INSERT IGNORE INTO `sensors` (`poller_type`,`sensor_class`,`device_id`,`sensor_oid`,`sensor_index`,`sensor_type`,`sensor_descr`,`sensor_divisor`,`sensor_multiplier`,`sensor_limit`,`sensor_limit_warn`,`sensor_limit_low`,`sensor_limit_low_warn`,`sensor_current`,`entPhysicalIndex`,`entPhysicalIndex_measured`,`user_func`,`group`,`rrd_type`) VALUES (snmp,temperature,20,,0,temperatureRadio,Internal Temp,1,1,38.8,38.8_warn,38.8_low,38.8_low_warn,18.8,,_measured,,,GAUGE))#0 /opt/librenms/includes/discovery/functions.inc.php(260): dbInsert()
刪除#1 /opt/librenms/includes/discovery/sensors/temperature/eltek-webpower.inc.php(25): discover_sensor()
#2 /opt/librenms/includes/discovery/functions.inc.php(1089): include('...')
#3 /opt/librenms/includes/discovery/sensors.inc.php(87): sensors()
#4 /opt/librenms/includes/discovery/functions.inc.php(167): include('...')
#5 /opt/librenms/discovery.php(108): discover_device()
#6 {main}
+
不知道是什麼原因?
這個問題已經太困難了...先看你的yaml是否正確。剩下的再不行就去github求救了
刪除好的!謝謝你,感謝大大
刪除你好,想請教您,我有一台UPS,上面有安裝IPMC網路卡,我在Librenms中有家此設備成功加入,但裡面沒有任何可監控數據顯示,廠商有提供MIB檔給我,但我不清楚該如何將此MIB檔匯入到Librenms中,請問您知道該如何做嗎
回覆刪除我有遇過因為無法識別裝置,導致它無法執行後續的動作。如果你看到的是generic ,可以試著把它刪除重加,但如果重加之後還是一樣,就要自己去找對應的MIB及YAML檔了。
刪除