Dieser Blogbeitrag ist eine Fortsetzung des vorherigen Teils 1, in dem wir die Grundlagen der SNMP-Integration mit ClusterControl behandelt haben.
In diesem Blogbeitrag konzentrieren wir uns auf SNMP-Traps und -Warnungen. SNMP-Traps sind die am häufigsten verwendeten Warnmeldungen, die von einem entfernten SNMP-fähigen Gerät (einem Agenten) an einen zentralen Kollektor, den „SNMP-Manager“, gesendet werden. Im Fall von ClusterControl könnte ein Trap eine Warnung sein, nachdem der kritische Alarm für einen Cluster nicht 0 ist, was darauf hinweist, dass etwas Schlimmes passiert.
Wie im vorherigen Blogpost gezeigt, haben wir zum Zweck dieses Proof-of-Concept zwei Definitionen für SNMP-Trap-Benachrichtigungen:
criticalAlarmNotification NOTIFICATION-TYPE
OBJECTS { totalCritical, clusterId }
STATUS current
DESCRIPTION
"Notification if critical alarm is not 0"
::= { alarmNotification 1 }
criticalAlarmNotificationEnded NOTIFICATION-TYPE
OBJECTS { totalCritical, clusterId }
STATUS current
DESCRIPTION
"Notification ended - Critical alarm is 0"
::= { alarmNotification 2 }
Die Benachrichtigungen (oder Traps) sind "criticalAlarmNotification" und "criticalAlarmNotificationEnded". Beide Benachrichtigungsereignisse können verwendet werden, um unserem Nagios-Dienst zu signalisieren, ob der Cluster aktiv kritische Alarme hat oder nicht. In Nagios wird dies als passive Prüfung bezeichnet, wobei Nagios nicht versucht festzustellen, ob ein Host/Service DOWN oder UNREACHABLE ist. Wir werden auch die aktiven Prüfungen konfigurieren, bei denen Prüfungen von der Prüflogik im Nagios-Daemon initiiert werden, indem die Dienstdefinition verwendet wird, um auch die von unserem Cluster gemeldeten kritischen/warnenden Alarme zu überwachen.
Beachten Sie, dass für diesen Blogpost die MIB und der SNMP-Agent von Multiplenines korrekt konfiguriert sein müssen, wie im ersten Teil dieser Blogserie gezeigt.
Installieren von Nagios Core
Nagios Core ist die kostenlose Version der Nagios Monitoring Suite. Als erstes müssen wir es und alle notwendigen Pakete installieren, gefolgt von den Nagios-Plugins, snmptrapd und snmptt. Beachten Sie, dass die Anweisungen in diesem Blogbeitrag davon ausgehen, dass alle Knoten unter CentOS 7 ausgeführt werden.
Installieren Sie die notwendigen Pakete, um Nagios auszuführen:
$ yum -y install httpd php gcc glibc glibc-common wget perl gd gd-devel unzip zip sendmail net-snmp-utils net-snmp-perl
Erstellen Sie einen Nagios-Benutzer und eine Nagcmd-Gruppe, damit die externen Befehle über die Webschnittstelle ausgeführt werden können, fügen Sie den Nagios- und Apache-Benutzer als Teil der Nagcmd-Gruppe hinzu:
$ useradd nagios
$ groupadd nagcmd
$ usermod -a -G nagcmd nagios
$ usermod -a -G nagcmd apache
Laden Sie hier die neueste Version von Nagios Core herunter, kompilieren und installieren Sie sie:
$ cd ~
$ wget https://assets.nagios.com/downloads/nagioscore/releases/nagios-4.4.6.tar.gz
$ tar -zxvf nagios-4.4.6.tar.gz
$ cd nagios-4.4.6
$ ./configure --with-nagios-group=nagios --with-command-group=nagcmd
$ make all
$ make install
$ make install-init
$ make install-config
$ make install-commandmode
Installieren Sie die Nagios-Webkonfiguration:
$ make install-webconf
Installieren Sie optional das Nagios-Peeling-Design (oder Sie bleiben beim Standard-Design):
$ make install-exfoliation
Erstellen Sie ein Benutzerkonto (nagiosadmin) für die Anmeldung an der Nagios-Weboberfläche. Merken Sie sich das Passwort, das Sie diesem Benutzer zuweisen:
$ htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin
Starten Sie den Apache-Webserver neu, damit die neuen Einstellungen wirksam werden:
$ systemctl restart httpd
$ systemctl enable httpd
Laden Sie die Nagios-Plugins von hier herunter, kompilieren und installieren Sie sie:
$ cd ~
$ wget https://nagios-plugins.org/download/nagios-plugins-2.3.3.tar.gz
$ tar -zxvf nagios-plugins-2.3.3.tar.gz
$ cd nagios-plugins-2.3.3
$ ./configure --with-nagios-user=nagios --with-nagios-group=nagios
$ make
$ make install
Überprüfen Sie die standardmäßigen Nagios-Konfigurationsdateien:
$ /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
Nagios Core 4.4.6
Copyright (c) 2009-present Nagios Core Development Team and Community Contributors
Copyright (c) 1999-2009 Ethan Galstad
Last Modified: 2020-04-28
License: GPL
Website: https://www.nagios.org
Reading configuration data...
Read main config file okay...
Read object config files okay...
Running pre-flight check on configuration data...
Checking objects...
Checked 8 services.
Checked 1 hosts.
Checked 1 host groups.
Checked 0 service groups.
Checked 1 contacts.
Checked 1 contact groups.
Checked 24 commands.
Checked 5 time periods.
Checked 0 host escalations.
Checked 0 service escalations.
Checking for circular paths...
Checked 1 hosts
Checked 0 service dependencies
Checked 0 host dependencies
Checked 5 timeperiods
Checking global event handlers...
Checking obsessive compulsive processor commands...
Checking misc settings...
Total Warnings: 0
Total Errors: 0
Things look okay - No serious problems were detected during the pre-flight check
If everything looks okay, start Nagios and configure it to start on boot:
$ systemctl start nagios
$ systemctl enable nagios
Öffnen Sie den Browser und gehen Sie zu http://{IPaddress}/nagios und Sie sollten sehen, dass eine HTTP-Basisauthentifizierung erscheint, wo Sie den Benutzernamen als nagiosadmin mit Ihrem zuvor erstellten Passwort angeben müssen.
Hinzufügen des ClusterControl-Servers zu Nagios
Erstellen Sie eine Nagios-Host-Definitionsdatei für ClusterControl:
$ vim /usr/local/nagios/etc/objects/clustercontrol.cfg
Und fügen Sie die folgenden Zeilen hinzu:
define host {
use linux-server
host_name clustercontrol.local
alias clustercontrol.mydomain.org
address 192.168.10.50
}
define service {
use generic-service
host_name clustercontrol.local
service_description Critical alarms - ClusterID 23
check_command check_snmp! -H 192.168.10.50 -P 2c -C private -o .1.3.6.1.4.1.57397.1.1.1.2 -c0
}
define service {
use generic-service
host_name clustercontrol.local
service_description Warning alarms - ClusterID 23
check_command check_snmp! -H 192.168.10.50 -P 2c -C private -o .1.3.6.1.4.1.57397.1.1.1.3 -w0
}
define service {
use snmp_trap_template
host_name clustercontrol.local
service_description Critical alarm traps
check_interval 60 ; Don't clear for 1 hour
}
Einige Erklärungen:
-
Im ersten Abschnitt definieren wir unseren Host mit dem Hostnamen und der Adresse des ClusterControl-Servers.
-
Die Dienstabschnitte, in denen wir unsere Dienstdefinitionen ablegen, die von Nagios überwacht werden sollen. Die ersten beiden weisen den Dienst im Grunde an, die SNMP-Ausgabe auf eine bestimmte Objekt-ID zu überprüfen. Beim ersten Dienst geht es um den kritischen Alarm, daher fügen wir -c0 in den Befehl check_snmp ein, um anzuzeigen, dass es sich um einen kritischen Alarm in Nagios handeln sollte, wenn der Wert über 0 hinausgeht. Während wir bei den Warnalarmen darauf hinweisen, wenn der Wert ist 1 und höher.
-
Die letzte Service-Definition betrifft die SNMP-Traps, die wir bei einem kritischen Alarm vom ClusterControl-Server erwarten würden angehoben ist größer als 0. Dieser Abschnitt verwendet die snmp_trap_template-Definition, wie im nächsten Schritt gezeigt.
Konfigurieren Sie das snmp_trap_template, indem Sie die folgenden Zeilen in /usr/local/nagios/etc/objects/templates.cfg hinzufügen:
define service {
name snmp_trap_template
service_description SNMP Trap Template
active_checks_enabled 1 ; Active service checks are enabled
passive_checks_enabled 1 ; Passive service checks are enabled/accepted
parallelize_check 1 ; Active service checks should be parallelized
process_perf_data 0
obsess_over_service 0 ; We should obsess over this service (if necessary)
check_freshness 0 ; Default is to NOT check service 'freshness'
notifications_enabled 1 ; Service notifications are enabled
event_handler_enabled 1 ; Service event handler is enabled
flap_detection_enabled 1 ; Flap detection is enabled
process_perf_data 1 ; Process performance data
retain_status_information 1 ; Retain status information across program restarts
retain_nonstatus_information 1 ; Retain non-status information across program restarts
check_command check-host-alive ; This will be used to reset the service to "OK"
is_volatile 1
check_period 24x7
max_check_attempts 1
normal_check_interval 1
retry_check_interval 1
notification_interval 60
notification_period 24x7
notification_options w,u,c,r
contact_groups admins ; Modify this to match your Nagios contactgroup definitions
register 0
}
Fügen Sie die ClusterControl-Konfigurationsdatei in Nagios ein, indem Sie die folgende Zeile darin einfügen
/usr/local/nagios/etc/nagios.cfg:
cfg_file=/usr/local/nagios/etc/objects/clustercontrol.cfg
Führen Sie eine Preflight-Konfigurationsprüfung durch:
$ /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
Stellen Sie sicher, dass Sie am Ende der Ausgabe die folgende Zeile erhalten:
"Things look okay - No serious problems were detected during the pre-flight check"
Starten Sie Nagios neu, um die Änderung zu laden:
$ systemctl restart nagios
Wenn wir uns nun die Nagios-Seite unter dem Service-Abschnitt (Menü auf der linken Seite) ansehen, würden wir so etwas sehen:
Beachten Sie, dass die Zeile „Kritische Alarme – ClusterID 1“ rot wird, wenn der von ClusterControl gemeldete kritische Alarmwert größer als 0 ist, während die Zeile „Warnalarme – ClusterID 1“ gelb ist, was darauf hinweist, dass ein Warnalarm ausgelöst wurde. Falls nichts Interessantes passiert, sehen Sie für clustercontrol.local alles grün.
Nagios so konfigurieren, dass es einen Trap empfängt
Traps werden von entfernten Geräten an den Nagios-Server gesendet, dies wird als passive Prüfung bezeichnet. Im Idealfall wissen wir nicht, wann ein Trap gesendet wird, da dies davon abhängt, ob das sendende Gerät entscheidet, dass es einen Trap sendet. Zum Beispiel mit einer USV (Batterie-Backup), sobald das Gerät die Stromversorgung verliert, sendet es eine Falle, um zu sagen:"Hey, ich habe die Stromversorgung verloren". So wird Nagios sofort informiert.
Um SNMP-Traps zu empfangen, müssen wir den Nagios-Server mit den folgenden Dingen konfigurieren:
-
snmptrapd (SNMP-Trap-Empfänger-Daemon)
-
snmptt (SNMP Trap Translator, der Trap-Handler-Daemon)
Nachdem der snmptrapd einen Trap empfängt, leitet er ihn an snmptt weiter, wo wir ihn konfigurieren werden, um das Nagios-System zu aktualisieren, und dann sendet Nagios die Warnung gemäß der Kontaktgruppenkonfiguration.
Installieren Sie das EPEL-Repository, gefolgt von den erforderlichen Paketen:
$ yum -y install epel-release
$ yum -y install net-snmp snmptt net-snmp-perl perl-Sys-Syslog
Konfigurieren Sie den SNMP-Trap-Daemon unter /etc/snmp/snmptrapd.conf und setzen Sie die folgenden Zeilen:
disableAuthorization yes
traphandle default /usr/sbin/snmptthandler
Das Obige bedeutet einfach, dass vom snmptrapd-Daemon empfangene Traps an /usr/sbin/snmptthandler weitergeleitet werden.
Fügen Sie die SEVERALNINES-CLUSTERCONTROL-MIB.txt in /usr/share/snmp/mibs hinzu, indem Sie /usr/share/snmp/mibs/SEVERALNINES-CLUSTERCONTROL-MIB.txt erstellen:
$ ll /usr/share/snmp/mibs/SEVERALNINES-CLUSTERCONTROL-MIB.txt
-rw-r--r-- 1 root root 4029 May 30 20:08 /usr/share/snmp/mibs/SEVERALNINES-CLUSTERCONTROL-MIB.txt
Erstellen Sie /etc/snmp/snmp.conf (Hinweis ohne das "d") und fügen Sie dort unsere benutzerdefinierte MIB hinzu:
mibs +SEVERALNINES-CLUSTERCONTROL-MIB
Starten Sie den snmptrapd-Dienst:
$ systemctl start snmptrapd
$ systemctl enable snmptrapd
Als nächstes müssen wir die folgenden Konfigurationszeilen in /etc/snmp/snmptt.ini konfigurieren:
net_snmp_perl_enable = 1
snmptt_conf_files = <<END
/etc/snmp/snmptt.conf
/etc/snmp/snmptt-cc.conf
END
Beachten Sie, dass wir das net_snmp_perl-Modul aktiviert und einen weiteren Konfigurationspfad hinzugefügt haben, /etc/snmp/snmptt-cc.conf innerhalb von snmptt.ini. Wir müssen hier ClusterControl snmptt-Ereignisse definieren, damit sie an Nagios übergeben werden können. Erstellen Sie eine neue Datei unter /etc/snmp/snmptt-cc.conf und fügen Sie die folgenden Zeilen hinzu:
MIB: SEVERALNINES-CLUSTERCONTROL-MIB (file:/usr/share/snmp/mibs/SEVERALNINES-CLUSTERCONTROL-MIB.txt) converted on Sun May 30 19:17:33 2021 using snmpttconvertmib v1.4.2
EVENT criticalAlarmNotification .1.3.6.1.4.1.57397.1.1.3.1 "Status Events" Critical
FORMAT Notification if the critical alarm is not 0
EXEC /usr/local/nagios/share/eventhandlers/submit_check_result $aA "Critical alarm traps" 2 "Critical - Critical alarm is $1 for cluster ID $2"
SDESC
Notification if critical alarm is not 0
Variables:
1: totalCritical
2: clusterId
EDESC
EVENT criticalAlarmNotificationEnded .1.3.6.1.4.1.57397.1.1.3.2 "Status Events" Normal
FORMAT Notification if the critical alarm is not 0
EXEC /usr/local/nagios/share/eventhandlers/submit_check_result $aA "Critical alarm traps" 0 "Normal - Critical alarm is $1 for cluster ID $2"
SDESC
Notification ended - critical alarm is 0
Variables:
1: totalCritical
2: clusterId
EDESC
Einige Erklärungen:
-
Wir haben zwei Traps definiert - kritischeAlarmNotifikation und kritischeAlarmNotifikationEnded.
-
Die criticalAlarmNotification löst einfach einen kritischen Alarm aus und leitet ihn an den in Nagios definierten "Critical Alarm Traps"-Dienst weiter. Das $aA bedeutet, die IP-Adresse des Trap-Agenten zurückzugeben. Der Wert 2 ist der Prüfergebniswert, der in diesem Fall kritisch ist (0=OK, 1=WARNUNG, 2=KRITISCH, 3=UNBEKANNT).
-
Die criticalAlarmNotificationEnded löst einfach eine OK-Warnung aus und leitet sie an den Dienst „Critical Alarm Traps“ weiter, um dies abzubrechen vorherige Falle, nachdem alles wieder normal ist. Das $aA bedeutet, die IP-Adresse des Trap-Agenten zurückzugeben. Der Wert 0 ist der Prüfergebniswert, der in diesem Fall OK ist. Weitere Einzelheiten zu von snmptt erkannten Zeichenfolgenersetzungen finden Sie in diesem Artikel im Abschnitt "FORMAT".
-
Sie können snmpttconvertmib verwenden, um eine snmptt-Event-Handler-Datei für eine bestimmte MIB zu generieren.
Beachten Sie, dass der Eventhandlers-Pfad standardmäßig nicht vom Nagios Core bereitgestellt wird. Daher müssen wir dieses eventhandlers-Verzeichnis aus der Nagios-Quelle in das contrib-Verzeichnis kopieren, wie unten gezeigt:
$ cp -Rf nagios-4.4.6/contrib/eventhandlers /usr/local/nagios/share/
$ chown -Rf nagios:nagios /usr/local/nagios/share/eventhandlers
Wir müssen auch die snmptt-Gruppe als Teil der nagcmd-Gruppe zuweisen, damit sie die nagios.cmd innerhalb des submit_check_result-Skripts ausführen kann:
$ usermod -a -G nagcmd snmptt
Starten Sie den snmptt-Dienst:
$ systemctl start snmptt
$ systemctl enable snmptt
Der SNMP-Manager (Nagios-Server) ist nun bereit, unsere eingehenden SNMP-Traps zu akzeptieren und zu verarbeiten.
Trap vom ClusterControl-Server senden
Angenommen, man möchte einen SNMP-Trap an den SNMP-Manager 192.168.10.11 (Nagios-Server) senden, weil die Gesamtzahl der kritischen Alarme 2 für Cluster-ID 1 erreicht hat, würde man den folgenden Befehl ausführen der ClusterControl-Server (clientseitig), 192.168.10.50:
$ snmptrap -v2c -c private 192.168.10.11 '' SEVERALNINES-CLUSTERCONTROL-MIB::criticalAlarmNotification \
SEVERALNINES-CLUSTERCONTROL-MIB::totalCritical i 2 \
SEVERALNINES-CLUSTERCONTROL-MIB::clusterId i 1
Oder im OID-Format (empfohlen):
$ snmptrap -v2c -c private 192.168.10.11 '' .1.3.6.1.4.1.57397.1.1.3.1 \
.1.3.6.1.4.1.57397.1.1.1.2 i 2 \
.1.3.6.1.4.1.57397.1.1.1.4 i 1
Wobei .1.3.6.1.4.1.57397.1.1.3.1 gleich dem Trap-Ereignis "criticalAlarmNotification" ist und die nachfolgenden OIDs Darstellungen der Gesamtzahl der aktuellen kritischen Alarme bzw. der Cluster-ID sind .
Auf dem Nagios-Server sollten Sie feststellen, dass der Trap-Dienst rot geworden ist:
Sie können es auch in /var/log/messages der folgenden Zeile sehen:
May 30 23:52:39 ip-10-15-2-148 snmptrapd[27080]: 2021-05-30 23:52:39 UDP: [192.168.10.50]:33151->[192.168.10.11]:162 [UDP: [192.168.10.50]:33151->[192.168.10.11]:162]:#012DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (2423020) 6:43:50.20#011SNMPv2-MIB::snmpTrapOID.0 = OID: SEVERALNINES-CLUSTERCONTROL-MIB::criticalAlarmNotification#011SEVERALNINES-CLUSTERCONTROL-MIB::totalCritical = INTEGER: 2#011SEVERALNINES-CLUSTERCONTROL-MIB::clusterId = INTEGER: 1
May 30 23:52:42 nagios.local snmptt[29557]: .1.3.6.1.4.1.57397.1.1.3.1 Critical "Status Events" UDP192.168.10.5033151-192.168.10.11162 - Notification if critical alarm is not 0
May 30 23:52:42 nagios.local nagios: EXTERNAL COMMAND: PROCESS_SERVICE_CHECK_RESULT;192.168.10.50;Critical alarm traps;2;Critical - Critical alarm is 2 for cluster ID 1
May 30 23:52:42 nagios.local nagios: PASSIVE SERVICE CHECK: clustercontrol.local;Critical alarm traps;0;PING OK - Packet loss = 0%, RTA = 22.16 ms
May 30 23:52:42 nagios.local nagios: SERVICE NOTIFICATION: nagiosadmin;clustercontrol.local;Critical alarm traps;CRITICAL;notify-service-by-email;Critical - Critical alarm is 2 for cluster ID 1
May 30 23:52:42 nagios.local nagios: SERVICE ALERT: clustercontrol.local;Critical alarm traps;CRITICAL;HARD;1;Critical - Critical alarm is 2 for cluster ID 1
Sobald der Alarm behoben ist, können wir den folgenden Befehl ausführen, um einen normalen Trap zu senden:
$ snmptrap -c private -v2c 192.168.10.11 '' .1.3.6.1.4.1.57397.1.1.3.2 \
.1.3.6.1.4.1.57397.1.1.1.2 i 0 \
.1.3.6.1.4.1.57397.1.1.1.4 i 1
Wobei .1.3.6.1.4.1.57397.1.1.3.2 gleich dem Ereignis "criticalAlarmNotificationEnded" ist und die nachfolgenden OIDs Darstellungen der Gesamtzahl der aktuellen kritischen Alarme sind (sollte in diesem Fall 0 sein ) bzw. die Cluster-ID.
Auf dem Nagios-Server sollten Sie feststellen, dass der Trap-Dienst wieder grün ist:
Das obige kann mit einem einfachen Bash-Skript automatisiert werden:
#!/bin/bash
# alarmtrapper.bash - SNMP trapper for ClusterControl alarms
CLUSTER_ID=1
SNMP_MANAGER=192.168.10.11
INTERVAL=10
send_critical_snmp_trap() {
# send critical trap
local val=$1
snmptrap -v2c -c private ${SNMP_MANAGER} '' .1.3.6.1.4.1.57397.1.1.3.1 .1.3.6.1.4.1.57397.1.1.1.1 i ${val} .1.3.6.1.4.1.57397.1.1.1.4 i ${CLUSTER_ID}
}
send_zero_critical_snmp_trap() {
# send OK trap
snmptrap -v2c -c private ${SNMP_MANAGER} '' .1.3.6.1.4.1.57397.1.1.3.2 .1.3.6.1.4.1.57397.1.1.1.1 i 0 .1.3.6.1.4.1.57397.1.1.1.4 i ${CLUSTER_ID}
}
while true; do
count=$(s9s alarm --list --long --cluster-id=${CLUSTER_ID} --batch | grep CRITICAL | wc -l)
[ $count -ne 0 ] && send_critical_snmp_trap $count || send_zero_critical_snmp_trap
sleep $INTERVAL
done
Um das Skript im Hintergrund auszuführen, tun Sie einfach:
$ bash alarmtrapper.bash &
An diesem Punkt sollten wir in der Lage sein, den "Critical Alarm Traps"-Dienst von Nagios automatisch in Aktion zu sehen, wenn in unserem Cluster automatisch ein Fehler auftritt.
Abschließende Gedanken
In dieser Blogserie haben wir einen Proof-of-Concept gezeigt, wie ClusterControl für die Überwachung, Generierung/Verarbeitung von Traps und Alarmierung mit dem SNMP-Protokoll konfiguriert werden kann. Dies markiert auch den Beginn unserer Reise zur Integration von SNMP in unsere zukünftigen Versionen. Bleiben Sie dran, wir werden weitere Updates zu dieser aufregenden Funktion veröffentlichen.