Rozszerzenie SNMP o własne wartości (na przykładzie temperatury dysków) dla np. ProxMox

SNMP to świetne narzędzie, czasami jednak brakuje w nim pewnych wartości, które chcielibyśmy przekazać, a pomimo ich dostępności w systemie MIB dla naszej klasy urządzenia i SNMP po prostu nie wiedzą, jak je pobrać.

Zainstalujmy SNMP

apt-get install snmpd
systemctl enable snmpd
systemctl start snmpd

W poprzednim poście opisywałem sposób pobrania i wyłuskania temperatury, skorzystajmy z tej wiedzy tworząc skrypt:

nano /opt/temp.sh

#!/bin/bash
/usr/sbin/hddtemp /dev/sda | sed -E  's/(.*):{1}(.*)/\2/' | sed -E 's/(.*)\°{1}(.*)/\1/' | sed -e 's/^[ \t]*//' > /tmp/sda.temp
/usr/sbin/nvme smart-log /dev/nvme0n1 | grep temperature | sed -E  's/(.*):{1}(.*)/\2/' | sed -E 's/(.*).C{1}(.*)/\1/' | sed 's/[[:space:]]*//g' > /tmp/nvme0n1.temp

Dodajmy uprawnienie na uruchomienie chmod +x /opt/temp.sh i możemy uruchomić skrypt. Utworzyło nam to dwa pliki sda.temp oraz nvme0n1.temp w katalogu plików tymczasowych /tmp. Wszystko pięknie, tylko jest to temperatura z momentu uruchomienia komendy, dodajmy skrypt do cyklicznego wykonywania, np. co 1 minutę

crontab -e
*/1 * * * * /opt/temp.sh

Uzyskaliśmy w ten sposób dwa pliki odświeżające się co minutę ze stanem temperatury. Zapytasz: Dlaczego tak, po co zapisywać to do pliki. Odpowiedź jest trywialna: ponieważ pobieranie danych smart/o temperaturze, wymaga czasu! Róbmy to cyklicznie, tak by np. SNMP nie musiało czekać na odpowiedź, a dane były na tyle świeże na ile możemy sobie na to pozwolić. Przekonałem ? No to lecimy dalej.

nano /etc/snmp/snmpd.conf

# dodajemy view pod już tam znajdującymi się
view   systemonly  included   .1.3.6.1.4.1.8072
# na końcu pliku dodajemy: extend <nazwa> <komenda>
extend sda_temp /usr/bin/cat /tmp/sda.temp
extend nvme0n1_temp /usr/bin/cat /tmp/nvme0n1_temp

Restart lub reload serwisu według uznania: systemctl restart snmpd

Korzystając z świetnego narzędzia, bez krótego nie wyobrażam sobie pracy z SNMP czyli snmpwalk przepytujemy nasz serwis:

snmpwalk -v 2c -c public <IP-Address> .1.3.6.1.4.1.8072

>>> informacja zwrotna powinna wyglądać mniej więcej tak
iso.3.6.1.4.1.8072.1.3.2.2.1.2.12.110.118.109.101.48.110.49.95.116.101.109.112 = STRING: "/usr/bin/cat"
iso.3.6.1.4.1.8072.1.3.2.2.1.3.12.110.118.109.101.48.110.49.95.116.101.109.112 = STRING: "/tmp/nvme0n1_temp"
iso.3.6.1.4.1.8072.1.3.2.2.1.4.12.110.118.109.101.48.110.49.95.116.101.109.112 = ""
iso.3.6.1.4.1.8072.1.3.2.2.1.20.12.110.118.109.101.48.110.49.95.116.101.109.112 = INTEGER: 4
iso.3.6.1.4.1.8072.1.3.2.2.1.21.12.110.118.109.101.48.110.49.95.116.101.109.112 = INTEGER: 1
iso.3.6.1.4.1.8072.1.3.2.4.1.2.12.110.118.109.101.48.110.49.95.116.101.109.112.1 = STRING: "35"

Jeżeli natomiast będą wyświetlać się nazwy obszarów MIB, z których pochodzą wartości np. NET-SNMP-EXTEND-MIB::nsExtendOutLine."sda_name".1 wtedy możemy skorzystac z kolejnego narzędzie jakim jest snmptranslate. snmptranslate -On NET-SNMP-EXTEND-MIB::nsExtendOutLine.\"sda_name\".1 powinien zwrócić numeryczny adres OID, który następnie może przydać się do tworzenia zapytań po stronie np. serwera monitorującego temperatury naszych dysków w serwerach.

W ten oto sposób utworzyliśmy customowe wpisy SNMP, które posłużą w przyszłości do stworzenia reguł na systemie monitorującym takim jak nagios czy zabbix.

# bonus
Pieśń niesie, że aby to działało trzeba odkomentować
rocommunity public localhost
w przypadku proxmoxa 7.2-x oraz debiana 11, nie było takiej potrzeby
Jedyny realny zabieg, o którym trzeba pamiętać w tych dystrybucjach (oba debianowe) to że snmp zbindowane jest do lokalhosta co uniemożliwia odpytanie snmp z zewnątrz, należy wpisać wtedy IP serwera lub/i zmienić [::1] na IPv6 jeżeli z tego korzystacie.
agentaddress  <adres_IPv4_SERWERA>,[::1]

# restart i powinno śmigać
systemctl restart snmpd

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*