¿Cómo configurar alertas de Nagios en un servidor dedicado?

Nagios es un potente sistema de monitorización que permite rastrear el estado de servidores, servicios y equipamiento de red. Sin embargo, para que Nagios sea realmente útil, es necesario configurar correctamente el sistema de alertas. Este artículo proporcionará una guía detallada sobre cómo configurar alertas de Nagios en un servidor dedicado, para que pueda reaccionar rápidamente a cualquier problema y minimizar el tiempo de inactividad. Veremos varias formas de configurar alertas, incluyendo el uso de correo electrónico y SMS, así como la integración con otros sistemas.

Contenido:

Configuración de alertas por correo electrónico

La configuración de alertas por correo electrónico es una de las formas más comunes y sencillas de recibir notificaciones de Nagios. Este método permite recibir informes detallados sobre el estado de sus servidores y servicios directamente en su correo electrónico. En esta sección, veremos en detalle cómo configurar el envío de alertas por correo electrónico desde Nagios, qué parámetros deben tenerse en cuenta y qué problemas comunes pueden surgir.

Configuración de parámetros de correo electrónico en Nagios

El primer paso es configurar los parámetros del correo electrónico en los archivos de configuración de Nagios. Los parámetros principales que deben especificarse incluyen el servidor SMTP, el puerto, las credenciales (si es necesario) y la dirección del remitente. Estos parámetros suelen especificarse en el archivo /etc/nagios/nagios.cfg. Abra este archivo con un editor de texto y busque la sección dedicada a la configuración del correo electrónico.

# grep email /etc/nagios/nagios.cfg
service_notification_options  w,u,c,r,f,s
host_notification_options   d,u,r,f,s
email_notification_options  w,u,c,r,f,s

Asegúrese de que los parámetros anteriores estén activados. Determinan en qué eventos se enviarán notificaciones (por ejemplo, en caso de advertencia (w), error crítico (c), recuperación (r)).

A continuación, es necesario configurar el comando para enviar el correo electrónico. Normalmente se utiliza el comando notify-service-by-email y notify-host-by-email, definidos en el archivo /etc/nagios/commands.cfg.

# grep notify-service-by-email /etc/nagios/commands.cfg
define command {
        command_name    notify-service-by-email
        command_line    /usr/bin/printf "%b" "*** Nagios *\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTNAME$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$\n" | /usr/bin/mail -s " $NOTIFICATIONTYPE$ Alerta de Servicio: $HOSTNAME$/$SERVICEDESC$ está $SERVICESTATE$ " $CONTACTEMAIL$
        }

# grep notify-host-by-email /etc/nagios/commands.cfg
define command {
        command_name    notify-host-by-email
        command_line    /usr/bin/printf "%b" "* Nagios *\n\nNotification Type: $NOTIFICATIONTYPE$\n\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$HOSTOUTPUT$\n" | /usr/bin/mail -s " $NOTIFICATIONTYPE$ Alerta de Host: $HOSTNAME$ está $HOSTSTATE$ **" $CONTACTEMAIL$
        }

Importante: Asegúrese de tener instalado el paquete mail o similar, necesario para enviar correo desde la línea de comandos. Por ejemplo, en Debian/Ubuntu: sudo apt-get install mailutils. En CentOS/RHEL: sudo yum install mailx.

Configuración de contactos para recibir alertas

Después de configurar los parámetros del correo electrónico, es necesario definir los contactos que recibirán las alertas. Esto se hace en el archivo /etc/nagios/conf.d/contacts.cfg (o en un archivo separado especificado en nagios.cfg). Es necesario crear una definición de contacto, especificando su nombre, dirección de correo electrónico y otros parámetros.

define contact {
        contact_name                    nagiosadmin
        alias                           Nagios Admin
        email                           nagios@example.com
        service_notification_period     24x7
        host_notification_period        24x7
        service_notification_options    w,u,c,r,f,s
        host_notification_options     d,u,r,f,s
        service_notification_commands   notify-service-by-email
        host_notification_commands      notify-host-by-email
        }

En este ejemplo, hemos creado un contacto con el nombre nagiosadmin, hemos especificado la dirección de correo electrónico nagios@example.com, hemos definido el período de recepción de notificaciones (24×7) y hemos especificado los comandos que se utilizarán para enviar notificaciones por correo electrónico.

Consejo experto: Para evitar el desbordamiento de la bandeja de entrada, considere la posibilidad de utilizar filtros en su programa de correo electrónico para ordenar automáticamente las notificaciones de Nagios.

Asociación de contactos a hosts y servicios

El último paso es asociar los contactos creados a los hosts y servicios para los que desea recibir alertas. Esto se hace en las definiciones de hosts y servicios en los archivos /etc/nagios/conf.d/hosts.cfg y /etc/nagios/conf.d/services.cfg (o en los archivos correspondientes especificados en nagios.cfg).

define host {
        use                     linux-server
        host_name               webserver1
        alias                   Web Server 1
        address                 192.168.1.100
        contacts                nagiosadmin
        }

define service {
        use                     generic-service
        host_name               webserver1
        service_description     HTTP
        check_command           check_http
        contacts                nagiosadmin
        }

En estos ejemplos, hemos asociado el contacto nagiosadmin al host webserver1 y al servicio HTTP. Ahora, cuando el estado de webserver1 o HTTP cambie, nagiosadmin recibirá una notificación por correo electrónico.

Después de realizar cambios en los archivos de configuración de Nagios, es necesario reiniciar el servicio Nagios para que los cambios surtan efecto:

sudo systemctl restart nagios

Ejemplo: Supongamos que desea configurar alertas para el espacio en disco en el servidor fileserver. Debe añadir un servicio al archivo /etc/nagios/conf.d/services.cfg:

define service {
        use                     generic-service
        host_name               fileserver
        service_description     Disk Space
        check_command           check_disk!20%!10%
        contacts                nagiosadmin
        }

En este ejemplo, utilizamos el comando check_disk para monitorizar el espacio en disco. Los parámetros 20%!10% indican los niveles de advertencia y error crítico (20% y 10% de espacio libre respectivamente). Después de añadir este servicio y reiniciar Nagios, recibirá notificaciones por correo electrónico cuando el espacio en disco en fileserver se acerque a estos niveles.

Importante: Compruebe siempre la sintaxis de los archivos de configuración de Nagios antes de reiniciar el servicio. Esto se puede hacer con el comando nagios -v /etc/nagios/nagios.cfg. Este comando comprobará los archivos de configuración en busca de errores y mostrará los mensajes correspondientes.

Configuración de alertas por SMS

Las alertas por SMS son una forma eficaz de recibir notificaciones sobre problemas críticos, especialmente cuando no hay acceso al correo electrónico. La configuración de alertas por SMS requiere la integración con un servicio de puerta de enlace SMS externo. En esta sección, veremos varias formas de configurar alertas por SMS, incluyendo el uso de servicios gratuitos y de pago, así como la configuración de comandos y contactos en Nagios.

Selección de una puerta de enlace SMS

El primer paso es seleccionar una puerta de enlace SMS adecuada. Existen muchos servicios que ofrecen servicios de puerta de enlace SMS, tanto de pago como gratuitos. Los servicios de pago suelen ofrecer una mayor fiabilidad y velocidad de entrega de los mensajes, así como mayores posibilidades de configuración. Los servicios gratuitos pueden tener limitaciones en el número de mensajes enviados o retrasos en la entrega.

Algunas puertas de enlace SMS populares:

  • Twilio
  • Nexmo (Vonage)
  • Clickatell
  • TextMagic

Para fines de prueba, se pueden utilizar puertas de enlace SMS gratuitas, pero para sistemas de producción se recomienda utilizar servicios de pago.

Configuración del comando para enviar SMS

Después de seleccionar la puerta de enlace SMS, es necesario configurar un comando en Nagios para enviar mensajes SMS. Este comando utilizará la API de la puerta de enlace SMS seleccionada para enviar mensajes. Debe crear un nuevo comando en el archivo /etc/nagios/commands.cfg.

Ejemplo: Configuración de un comando para enviar SMS a través de Twilio:

define command {
        command_name    notify-service-by-sms
        command_line    /usr/bin/curl -X POST 'https://api.twilio.com/2010-04-01/Accounts/ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/Messages.json' \
        --data-urlencode 'To=$CONTACTPAGER$' \
        --data-urlencode 'From=+1234567890' \
        --data-urlencode 'Body=Nagios: $NOTIFICATIONTYPE$ - $HOSTNAME$ - $SERVICEDESC$ is $SERVICESTATE$' \
        -u ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:your_auth_token
        }

define command {
        command_name    notify-host-by-sms
        command_line    /usr/bin/curl -X POST 'https://api.twilio.com/2010-04-01/Accounts/ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/Messages.json' \
        --data-urlencode 'To=$CONTACTPAGER$' \
        --data-urlencode 'From=+1234567890' \
        --data-urlencode 'Body=Nagios: $NOTIFICATIONTYPE$ - $HOSTNAME$ is $HOSTSTATE$' \
        -u ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:your_auth_token
        }

En este ejemplo, sustituya ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx por su Account SID de Twilio, +1234567890 por su número de teléfono de Twilio y your_auth_token por su Auth Token de Twilio. Asegúrese también de tener instalado el paquete curl.

Importante: Guarde sus credenciales de API en un lugar seguro y no las publique en un lugar público.

Configuración de contactos para recibir alertas por SMS

Ahora es necesario configurar los contactos que recibirán las alertas por SMS. Esto se hace en el archivo /etc/nagios/conf.d/contacts.cfg. Es necesario especificar el número de teléfono del contacto en el parámetro pager.

define contact {
        contact_name                    admin_sms
        alias                           Admin SMS
        pager                           +79991234567
        service_notification_period     24x7
        host_notification_period        24x7
        service_notification_options    w,u,c,r,f,s
        host_notification_options     d,u,r,f,s
        service_notification_commands   notify-service-by-sms
        host_notification_commands      notify-host-by-sms
        }

En este ejemplo, hemos creado un contacto con el nombre admin_sms y hemos especificado el número de teléfono +79991234567. Tenga en cuenta que el número de teléfono debe especificarse en formato internacional.

Ejemplo: Si utiliza Nexmo, el comando para enviar SMS tendrá el siguiente aspecto:

define command {
        command_name    notify-service-by-sms
        command_line    /usr/bin/curl -d "api_key=YOUR_API_KEY&api_secret=YOUR_API_SECRET&to=$CONTACTPAGER$&from=Nagios&text=Nagios: $NOTIFICATIONTYPE$ - $HOSTNAME$ - $SERVICEDESC$ is $SERVICESTATE$" 'https://rest.nexmo.com/sms/json'
        }

define command {
        command_name    notify-host-by-sms
        command_line    /usr/bin/curl -d "api_key=YOUR_API_KEY&api_secret=YOUR_API_SECRET&to=$CONTACTPAGER$&from=Nagios&text=Nagios: $NOTIFICATIONTYPE$ - $HOSTNAME$ is $HOSTSTATE$" 'https://rest.nexmo.com/sms/json'
        }

Sustituya YOUR_API_KEY y YOUR_API_SECRET por sus credenciales de Nexmo.

Consejo experto: Utilice los límites de envío de SMS proporcionados por su puerta de enlace SMS para evitar gastos inesperados.

Asociación de contactos a hosts y servicios

Al igual que con las alertas por correo electrónico, es necesario asociar los contactos a los hosts y servicios para los que desea recibir alertas por SMS. Esto se hace en las definiciones de hosts y servicios en los archivos /etc/nagios/conf.d/hosts.cfg y /etc/nagios/conf.d/services.cfg.

define host {
        use                     linux-server
        host_name               dbserver
        alias                   Database Server
        address                 192.168.1.101
        contacts                admin_sms
        }

define service {
        use                     generic-service
        host_name               dbserver
        service_description     Database Connection
        check_command           check_tcp!3306
        contacts                admin_sms
        }

Después de realizar cambios en los archivos de configuración de Nagios, es necesario reiniciar el servicio Nagios:

sudo systemctl restart nagios

Importante: Pruebe el envío de alertas por SMS para asegurarse de que funcionan correctamente. Puede provocar un error manualmente para generar una alerta.

Integración con Slack y Telegram

La integración de Nagios con plataformas de mensajería como Slack y Telegram permite recibir notificaciones sobre problemas en tiempo real directamente en sus canales de comunicación. Esto puede acelerar significativamente el proceso de respuesta a incidentes. En esta sección, veremos cómo configurar la integración de Nagios con Slack y Telegram para recibir notificaciones sobre el estado de sus servidores y servicios.

Integración con Slack

Para integrar Nagios con Slack, es necesario crear una Slack App y configurar un webhook entrante. Un webhook es una URL a la que Nagios enviará notificaciones en formato JSON.

Pasos para configurar la integración con Slack:

  • Cree una Slack App en su espacio de trabajo de Slack.
  • Active Incoming Webhooks en la configuración de su Slack App.
  • Obtenga la URL del webhook.
  • Configure un comando en Nagios para enviar notificaciones al webhook.

Ejemplo: Configuración de un comando en /etc/nagios/commands.cfg para enviar notificaciones a Slack:

define command {
        command_name    notify-service-by-slack
        command_line    /usr/bin/curl -X POST --data-urlencode "payload={\"channel\": \"#nagios-alerts\", \"username\": \"Nagios\", \"text\": \"*$NOTIFICATIONTYPE* Alerta de Servicio: $HOSTNAME$/$SERVICEDESC$ está $SERVICESTATE$ - $SERVICEOUTPUT$\", \"icon_emoji\": \":warning:\"}" YOUR_SLACK_WEBHOOK_URL
        }

define command {
        command_name    notify-host-by-slack
        command_line    /usr/bin/curl -X POST --data-urlencode "payload={\"channel\": \"#nagios-alerts\", \"username\": \"Nagios\", \"text\": \"*$NOTIFICATIONTYPE* Alerta de Host: $HOSTNAME$ está $HOSTSTATE$ - $HOSTOUTPUT$\", \"icon_emoji\": \":warning:\"}" YOUR_SLACK_WEBHOOK_URL
        }

Sustituya YOUR_SLACK_WEBHOOK_URL por la URL del webhook obtenida al configurar la Slack App. El parámetro channel define el canal al que se enviarán las notificaciones. El parámetro icon_emoji define el emoji que se mostrará junto a la notificación.

A continuación, configure los contactos en /etc/nagios/conf.d/contacts.cfg, especificando los comandos para enviar notificaciones a Slack:

define contact {
        contact_name                    admin_slack
        alias                           Admin Slack
        email                           ignore@example.com
        service_notification_period     24x7
        host_notification_period        24x7
        service_notification_options    w,u,c,r,f,s
        host_notification_options     d,u,r,f,s
        service_notification_commands   notify-service-by-slack
        host_notification_commands      notify-host-by-slack
        }

Por último, asocie el contacto admin_slack a los hosts y servicios para los que desea recibir notificaciones en Slack.

Importante: Slack requiere que la URL del webhook esté protegida por el protocolo HTTPS. Asegúrese de que su servidor esté configurado para utilizar HTTPS.

Integración con Telegram

Para integrar Nagios con Telegram, es necesario crear un Telegram Bot y obtener su API Token y Chat ID. El API Token es el identificador único de su bot, y el Chat ID es el identificador del chat al que se enviarán las notificaciones.

Pasos para configurar la integración con Telegram:

  • Cree un Telegram Bot utilizando BotFather en Telegram.
  • Obtenga el API Token de su bot.
  • Obtenga el Chat ID del chat al que desea enviar las notificaciones.
  • Configure un comando en Nagios para enviar notificaciones a través de la API de Telegram.

Ejemplo: Configuración de un comando en /etc/nagios/commands.cfg para enviar notificaciones a Telegram:

define command {
        command_name    notify-service-by-telegram
        command_line    /usr/bin/curl -s -X POST "https://api.telegram.org/botYOUR_TELEGRAM_BOT_TOKEN/sendMessage" -d "chat_id=YOUR_TELEGRAM_CHAT_ID&text=*$NOTIFICATIONTYPE*%20Alerta%20de%20Servicio:%20$HOSTNAME$/$SERVICEDESC$%20está%20$SERVICESTATE$%20-%20$SERVICEOUTPUT$"
        }

define command {
        command_name    notify-host-by-telegram
        command_line    /usr/bin/curl -s -X POST "https://api.telegram.org/botYOUR_TELEGRAM_BOT_TOKEN/sendMessage" -d "chat_id=YOUR_TELEGRAM_CHAT_ID&text=*$NOTIFICATIONTYPE*%20Alerta%20de%20Host:%20$HOSTNAME$%20está%20$HOSTSTATE$%20-%20$HOSTOUTPUT$"
        }

Sustituya YOUR_TELEGRAM_BOT_TOKEN por el API Token de su bot, y YOUR_TELEGRAM_CHAT_ID por el Chat ID del chat. Los símbolos %20 se utilizan para codificar los espacios en la URL.

A continuación, configure los contactos en /etc/nagios/conf.d/contacts.cfg, especificando los comandos para enviar notificaciones a Telegram:

define contact {
        contact_name                    admin_telegram
        alias                           Admin Telegram
        email                           ignore@example.com
        service_notification_period     24x7
        host_notification_period        24x7
        service_notification_options    w,u,c,r,f,s
        host_notification_options     d,u,r,f,s
        service_notification_commands   notify-service-by-telegram
        host_notification_commands      notify-host-by-telegram
        }

Por último, asocie el contacto admin_telegram a los hosts y servicios para los que desea recibir notificaciones en Telegram.

Ejemplo: Si desea enviar notificaciones en Telegram en formato Markdown, utilice el parámetro parse_mode=Markdown en la solicitud:

define command {
        command_name    notify-service-by-telegram
        command_line    /usr/bin/curl -s -X POST "https://api.telegram.org/botYOUR_TELEGRAM_BOT_TOKEN/sendMessage" -d "chat_id=YOUR_TELEGRAM_CHAT_ID&text=*$NOTIFICATIONTYPE*%20Alerta%20de%20Servicio:%20$HOSTNAME$/$SERVICEDESC$%20está%20$SERVICESTATE$%20-%20$SERVICEOUTPUT$&parse_mode=Markdown"
        }

Consejo experto: Utilice diferentes canales o chats para diferentes tipos de notificaciones para facilitar el filtrado y la priorización.

Comparación de métodos de alerta:

Método de alertaVentajasDesventajas
Correo electrónicoInformación detallada, facilidad de configuraciónRetraso en la entrega, puede pasarse por alto
SMSEntrega rápida, fiabilidadTamaño limitado del mensaje, coste
Slack/TelegramNotificaciones instantáneas, colaboraciónRequiere conexión a Internet, puede ser una distracción

Configuración de la escalada de alertas

La escalada de alertas es un mecanismo que permite enviar notificaciones a diferentes grupos de personas dependiendo de la gravedad del problema y el tiempo transcurrido desde su detección. Esto garantiza que los problemas críticos no se ignoren y se resuelvan lo antes posible. En esta sección, veremos cómo configurar la escalada de alertas en Nagios para que las notificaciones se envíen a diferentes contactos o grupos de contactos en función de diferentes condiciones.

Definición de períodos de alerta

El primer paso para configurar la escalada de alertas es definir los períodos de alerta. Los períodos de alerta definen a qué hora del día y en qué días de la semana se deben enviar las notificaciones. Esto evita el envío de notificaciones fuera del horario laboral si no es necesario.

Los períodos de alerta se definen en el archivo /etc/nagios/conf.d/timeperiods.cfg (o en un archivo separado especificado en nagios.cfg).

define timeperiod {
        timeperiod_name     24x7
        alias               24 Horas al Día, 7 Días a la Semana
        use                 generic-timeperiod
        start_time          00:00
        end_time            24:00
        }

define timeperiod {
        timeperiod_name     workhours
        alias               Horario Laboral
        use                 generic-timeperiod
        monday              09:00-18:00
        tuesday             09:00-18:00
        wednesday           09:00-18:00
        thursday            09:00-18:00
        friday              09:00-18:00
        }

En este ejemplo, hemos definido dos períodos de alerta: 24x7 (las 24 horas del día, los 7 días de la semana) y workhours (horario laboral de lunes a viernes).

Definición de grupos de contactos

El siguiente paso es definir los grupos de contactos. Los grupos de contactos permiten agrupar varios contactos en un solo grupo para simplificar la gestión de alertas. Esto es útil cuando es necesario enviar notificaciones a varias personas al mismo tiempo.

Los grupos de contactos se definen en el archivo /etc/nagios/conf.d/contacts.cfg.

define contactgroup {
        contactgroup_name   admins
        alias               Administradores de Nagios
        members             nagiosadmin, admin_sms, admin_telegram
        }

define contactgroup {
        contactgroup_name   developers
        alias               Equipo de Desarrolladores
        members             developer1, developer2
        }

En este ejemplo, hemos definido dos grupos de contactos: admins (administradores) y developers (desarrolladores). El grupo admins incluye los contactos nagiosadmin, admin_sms y admin_telegram, y el grupo developers incluye los contactos developer1 y developer2.

Configuración de la escalada para hosts y servicios

Ahora es necesario configurar la escalada para hosts y servicios. Esto se hace en las definiciones de hosts y servicios en los archivos /etc/nagios/conf.d/hosts.cfg y /etc/nagios/conf.d/services.cfg. Para configurar la escalada, se utilizan los parámetros notification_interval, first_notification_delay, notification_period y contacts/contact_groups.

Ejemplo: Configuración de la escalada para un host:

define host {
        use                     linux-server
        host_name               important_server
        alias                   Important