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