sql >> Base de Datos >  >> NoSQL >> MongoDB

Integración de ClusterControl con SNMP:segunda parte

Esta publicación de blog es una continuación de la parte 1 anterior, donde cubrimos los conceptos básicos de la integración de SNMP con ClusterControl.

En esta publicación de blog, nos centraremos en las trampas y alertas de SNMP. Las trampas de SNMP son los mensajes de alerta que se usan con más frecuencia y que se envían desde un dispositivo habilitado para SNMP remoto (un agente) a un recopilador central, el "administrador de SNMP". En el caso de ClusterControl, una trampa podría ser una alerta después de que la alarma crítica para un clúster no sea 0, lo que indica que algo malo está sucediendo.

Como se muestra en la publicación de blog anterior, para esta prueba de concepto, tenemos dos definiciones de notificaciones de trampas SNMP:

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 }

Las notificaciones (o trampas) son CriticalAlarmNotification y CriticalAlarmNotificationEnded. Ambos eventos de notificación se pueden usar para señalar nuestro servicio Nagios, ya sea que el clúster tenga alarmas críticas activas o no. En Nagios, el término para esto es verificación pasiva, mediante la cual Nagios no intenta determinar si el host/servicio está INACTIVO o INALCANCEABLE. También configuraremos las comprobaciones activas, donde la lógica de comprobación inicia las comprobaciones en el demonio de Nagios mediante el uso de la definición del servicio para monitorear también las alarmas críticas/de advertencia informadas por nuestro clúster.

Tenga en cuenta que esta publicación de blog requiere que el agente MIB y SNMP de Variousnines esté configurado correctamente, como se muestra en la primera parte de esta serie de blogs.

Instalación del núcleo de Nagios

Nagios Core es la versión gratuita de la suite de monitoreo de Nagios. En primer lugar, tenemos que instalarlo y todos los paquetes necesarios, seguido de los complementos de Nagios, snmptrapd y snmptt. Tenga en cuenta que las instrucciones en esta publicación de blog asumen que todos los nodos se ejecutan en CentOS 7.

Instalar los paquetes necesarios para ejecutar Nagios:

$ yum -y install httpd php gcc glibc glibc-common wget perl gd gd-devel unzip zip sendmail net-snmp-utils net-snmp-perl

Cree un usuario nagios y un grupo nagcmd para permitir que los comandos externos se ejecuten a través de la interfaz web, agregue el usuario nagios y apache para que formen parte del grupo nagcmd:

$ useradd nagios
$ groupadd nagcmd
$ usermod -a -G nagcmd nagios
$ usermod -a -G nagcmd apache

Descargue la última versión de Nagios Core desde aquí, compílelo e instálelo:

$ 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

Instalar la configuración web de Nagios:

$ make install-webconf

Opcionalmente, instale el tema de exfoliación de Nagios (o puede ceñirse al tema predeterminado):

$ make install-exfoliation

Cree una cuenta de usuario (nagiosadmin) para iniciar sesión en la interfaz web de Nagios. Recuerda la contraseña que le asignas a este usuario:

$ htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin

Reinicie el servidor web Apache para que la nueva configuración surta efecto:

$ systemctl restart httpd
$ systemctl enable httpd

Descargue los complementos de Nagios desde aquí, compílelos e instálelos:

$ 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

Verifique los archivos de configuración predeterminados de Nagios:

$ /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

Abra el navegador y vaya a http://{IPaddress}/nagios y debería ver una autenticación básica HTTP donde debe especificar el nombre de usuario como nagiosadmin con la contraseña elegida creada anteriormente.

Añadiendo servidor ClusterControl a Nagios

Cree un archivo de definición de host de Nagios para ClusterControl:

$ vim /usr/local/nagios/etc/objects/clustercontrol.cfg

Y agregue las siguientes líneas:

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
}

Algunas explicaciones:

  • En la primera sección, definimos nuestro host, con el nombre de host y la dirección del servidor ClusterControl.

  • Las secciones de servicio donde colocamos nuestras definiciones de servicio para que sean monitoreadas por Nagios. Los dos primeros básicamente le dicen al servicio que verifique la salida SNMP para un ID de objeto en particular. El primer servicio es sobre la alarma crítica, por lo tanto agregamos -c0 en el comando check_snmp para indicar que debe ser una alerta crítica en Nagios si el valor va más allá de 0. Mientras que para las alarmas de advertencia, lo indicaremos con una advertencia si el valor es 1 y superior.

  • La última definición de servicio se refiere a las trampas SNMP que esperaríamos que vinieran del servidor ClusterControl si la alarma crítica elevado es mayor que 0. Esta sección utilizará la definición snmp_trap_template, como se muestra en el siguiente paso.

Configure snmp_trap_template agregando las siguientes líneas en /usr/local/nagios/etc/objects/templates.cfg:

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
}

Incluya el archivo de configuración de ClusterControl en Nagios agregando la siguiente línea dentro  

/usr/local/nagios/etc/nagios.cfg:
cfg_file=/usr/local/nagios/etc/objects/clustercontrol.cfg

Ejecute una verificación de configuración previa al vuelo:

$ /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

Asegúrese de obtener la siguiente línea al final de la salida:

"Things look okay - No serious problems were detected during the pre-flight check"

Reinicie Nagios para cargar el cambio:

$ systemctl restart nagios

Ahora, si observamos la página de Nagios en la sección Servicio (menú del lado izquierdo), veríamos algo como esto:

Observe que la fila "Alarmas críticas - ClusterID 1" se vuelve roja si el valor de alarma crítica informado por ClusterControl es mayor que 0, mientras que "Alarmas de advertencia - ClusterID 1" es amarilla, lo que indica que se ha activado una alarma de advertencia. En caso de que no suceda nada interesante, verá que todo está verde para clustercontrol.local.

Configurando Nagios para recibir una trampa

Las trampas se envían mediante dispositivos remotos al servidor de Nagios, esto se denomina control pasivo. Idealmente, no sabemos cuándo se enviará una trampa, ya que depende del dispositivo de envío que decida enviar una trampa. Por ejemplo, con un UPS (batería de respaldo), tan pronto como el dispositivo pierda energía, enviará una trampa para decir "oye, perdí energía". De esta forma se informa inmediatamente a Nagios.

Para recibir trampas SNMP, debemos configurar el servidor Nagios con lo siguiente:

  • snmptrapd (demonio receptor de trampas SNMP)

  • snmptt (Traductor de trampas SNMP, el demonio del manejo de trampas)

Después de que snmptrapd reciba una trampa, la pasará a snmptt donde lo configuraremos para actualizar el sistema Nagios y luego Nagios enviará la alerta de acuerdo con la configuración del grupo de contacto.

Instale el repositorio EPEL, seguido de los paquetes necesarios:

$ yum -y install epel-release
$ yum -y install net-snmp snmptt net-snmp-perl perl-Sys-Syslog

Configure el daemon trap SNMP en /etc/snmp/snmptrapd.conf y establezca las siguientes líneas:

disableAuthorization yes
traphandle default /usr/sbin/snmptthandler

Lo anterior simplemente significa que las trampas recibidas por el demonio snmptrapd se pasarán a /usr/sbin/snmptthandler.

Agregue SEVERALNINES-CLUSTERCONTROL-MIB.txt en /usr/share/snmp/mibs creando /usr/share/snmp/mibs/SEVERALNINES-CLUSTERCONTROL-MIB.txt:

$ 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

Cree /etc/snmp/snmp.conf (aviso sin la "d") y agregue nuestro MIB personalizado allí:

mibs +SEVERALNINES-CLUSTERCONTROL-MIB

Iniciar el servicio snmptrapd:

$ systemctl start snmptrapd
$ systemctl enable snmptrapd

A continuación, debemos configurar las siguientes líneas de configuración dentro de /etc/snmp/snmptt.ini:

net_snmp_perl_enable = 1
snmptt_conf_files = <<END
/etc/snmp/snmptt.conf
/etc/snmp/snmptt-cc.conf
END

Tenga en cuenta que habilitamos el módulo net_snmp_perl y agregamos otra ruta de configuración, /etc/snmp/snmptt-cc.conf dentro de snmptt.ini. Necesitamos definir los eventos snmptt de ClusterControl aquí para que puedan pasarse a Nagios. Cree un nuevo archivo en /etc/snmp/snmptt-cc.conf y agregue las siguientes líneas:

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

Algunas explicaciones:

  • Tenemos dos trampas definidas:CriticalAlarmNotification y CriticalAlarmNotificationEnded.

  • criticalAlarmNotification simplemente genera una alerta crítica y la pasa al servicio de "trampas de alarma crítica" definido en Nagios. El $aA significa devolver la dirección IP del agente trap. El valor 2 es el valor del resultado de la comprobación, que en este caso es crítico (0=OK, 1=ADVERTENCIA, 2=CRÍTICO, 3=DESCONOCIDO).

  • criticalAlarmNotificationEnded simplemente genera una alerta OK y la pasa al servicio "Critical alarm traps", para cancelar la trampa anterior después de que todo vuelva a la normalidad. El $aA significa devolver la dirección IP del agente trap. El valor 0 es el valor del resultado de la verificación, que en este caso es correcto. Para obtener más detalles sobre las sustituciones de cadenas reconocidas por snmptt, consulte este artículo en la sección "FORMATO".

  • Puede usar snmpttconvertmib para generar un archivo de controlador de eventos snmptt para una MIB en particular.

Tenga en cuenta que, de forma predeterminada, Nagios Core no proporciona la ruta de los controladores de eventos. Por lo tanto, tenemos que copiar ese directorio de manejadores de eventos de la fuente de Nagios en el directorio contrib, como se muestra a continuación:

$ cp -Rf nagios-4.4.6/contrib/eventhandlers /usr/local/nagios/share/
$ chown -Rf nagios:nagios /usr/local/nagios/share/eventhandlers

También necesitamos asignar el grupo snmptt como parte del grupo nagcmd, para que pueda ejecutar nagios.cmd dentro del script de submit_check_result:

$ usermod -a -G nagcmd snmptt

Inicie el servicio snmptt:

$ systemctl start snmptt
$ systemctl enable snmptt

El administrador de SNMP (servidor Nagios) ahora está listo para aceptar y procesar nuestras trampas SNMP entrantes.

Enviando una trampa desde el servidor ClusterControl

Suponga que desea enviar una trampa SNMP al administrador SNMP, 192.168.10.11 (servidor Nagios) porque el número total de alarmas críticas ha llegado a 2 para el ID de clúster 1, se ejecutaría el siguiente comando en el servidor ClusterControl (lado del cliente), 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

O, en formato OID (recomendado):

$ 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

Donde, .1.3.6.1.4.1.57397.1.1.3.1 es igual al evento de captura CriticalAlarmNotification, y los OID subsiguientes son representaciones del número total de alarmas críticas actuales y el ID del clúster, respectivamente .

En el servidor de Nagios, debería notar que el servicio de captura se ha vuelto rojo:

También puedes verlo en el /var/log/messages de la siguiente línea:

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

Una vez resuelta la alarma, para enviar una trampa normal, podemos ejecutar el siguiente comando:

$ 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

Donde, .1.3.6.1.4.1.57397.1.1.3.2 es igual al evento CriticalAlarmNotificationEnded, y los OID subsiguientes son representaciones del número total de alarmas críticas actuales (debe ser 0 para este caso ) y el ID del clúster, respectivamente.

En el servidor de Nagios, debería notar que el servicio de trampas vuelve a estar en verde:

Lo anterior se puede automatizar con un simple script bash:

#!/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

Para ejecutar el script en segundo plano, simplemente haga lo siguiente:

$ bash alarmtrapper.bash &

En este punto, deberíamos poder ver el servicio de "Trampas de alarma crítica" de Nagios en acción si hay una falla en nuestro clúster automáticamente.

Reflexiones finales

En esta serie de blogs, mostramos una prueba de concepto sobre cómo se puede configurar ClusterControl para monitorear, generar/procesar trampas y alertar mediante el protocolo SNMP. Esto también marca el comienzo de nuestro viaje para incorporar SNMP en nuestros futuros lanzamientos. Estén atentos, ya que traeremos más actualizaciones sobre esta interesante función.