Enviar notificaciones vía email con Nagios

Nagios

Una de las funciones más interesantes de Nagios es la notificación de los eventos de la red. Una avería en una línea no es difícil de detectar, suelen ser los usuarios los primeros en quejarse. Pero una caída de un servicio que en ese momento no se está usando es más complida de ver. Para no tener que estar todo el día mirando el monitor del Nagios, existe la opción de crear contactos y que se les notifiquen los eventos de la manera que se elija (email, SMS, …). Obviamente la herramienta más común para estas notificaciones será el correo, ya que no todas las empresas disponen de una pasarela de envío de SMS o similar. Para poder enviarlas nos hará falta un servidor de correo, bien en nuestra propia red como en internet. Paso a relataros como he solucionado yo el tema sin usar un servidor de correo en el equipo del Nagios.

Para empezar, en el fichero de configuración de contactos se deben crear los perfiles de los usuarios a los que se debe avisar, así como los grupos a los que pertenecen.

#definimos un contacto predefinido, para no tener que declarar todas las opciones de cada usuario
define contact{
name contacto-basico
service_notification_period laboral
host_notification_period laboral
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 notificar-host
register 0
}

#definimos el grupo admins, al que pertenece el contacto dani
define contactgroup{
contactgroup_name admins
alias Administradores
members dani
}

#definimos el contacto dani, con un alias y una direccion de email
define contact{
contact_name dani
use contacto-basico
alias Dani
email dani@ejemplo.es
}

Una vez editados los contactos, nos hace falta añadir el comando al fichero oportuno para que Nagios sepa donde buscarlo. Además configuramos la sintaxis con la que se invocará desde Nagios. En éste caso pasamos varias variables predefinidas en el sistema.

#definimos el comando notificar-host
define command{
command_name notificar-host
command_line /tmp/correo.pl $CONTACTEMAIL$ $NOTIFICATIONTYPE$ $HOSTNAME$ $HOSTSTATE$ $HOSTADDRESS$
}

Por último, debemos crear “correo.pl”, que en éste caso es un script en Perl que nos permitirá el envío de correos. Cambiaremos los parámetros para adaptarlo a nuestras necesidades y lo guardaremos en “/tmp”, como hemos definido en el fichero anterior.

#!/usr/bin/perl
use Net::SMTP;
$destinatario=$ARGV[0];
$tipo=$ARGV[1];
$host=$ARGV[2];
$estado=$ARGV[3];
$ip=$ARGV[4];
$smtp= Net::SMTP-> new ("smtp.ejemplo.es");
$smtp->mail("nagios\@ejemplo.es");
$smtp->to("$destinatario");
$smtp->data();
$smtp->datasend("To: $destinatario\n");
$smtp->datasend("Subject: NAGIOS - $tipo: $host con estado $estado\n");
$smtp->datasend("Notificacion de tipo: $tipo\n");
$smtp->datasend("Equipo: $host ($ip)\n");
$smtp->datasend("Estado actual: $estado\n");
$smtp->datasend();
$smtp->quit;

Una vez configurado todo esto, ya dispondremos de notificaciones vía email. He partido de la suposición de que Nagios está funcionando y configurado y que esto es un añadido, de forma que no haya que configurar nada más. La mejor opción para aprender a configurar Nagios es partir de los ficheros de ejemplo y modificarlos de acuerdo a vuestras necesidades.

EDITO

Para los que necesiten una versión que funcione en con un servidor que requiera autentificación:

#!/usr/bin/perl
use Net::SMTP;
$destinatario=$ARGV[0];
$tipo=$ARGV[1];
$host=$ARGV[2];
$estado=$ARGV[3];
$ip=$ARGV[4];
$smtp= Net::SMTP->new('smtp.ejemplo.com');
$smtp->auth('usuario', 'contraseña');
$smtp->mail('nagios@ejemplo.com');
$smtp->to(”$destinatario”);
$smtp->data();
$smtp->datasend(”To: $destinatario\n”);
$smtp->datasend(”Subject: NAGIOS – $tipo: $host con estado $estado\n”);
$smtp->datasend(”\n”);
$smtp->datasend(”Notificacion de tipo: $tipo\n”);
$smtp->datasend(”Equipo: $host ($ip)\n”);
$smtp->datasend(”Estado actual: $estado\n”);
$smtp->datasend();
$smtp->quit;

Ahora mismo estoy probándolo y no me ha dado problemas. En caso de que queráis hacer un debug, podeis cambiar la línea del servidor por la siguiente:

$smtp= Net::SMTP->new(’smtp.ejemplo.com’, Debug => 1);

Y luego probar el script usando:

./nombre_script.pl dirección_de_correo_de_prueba error equipo estado ip

118 thoughts on “Enviar notificaciones vía email con Nagios

  1. Dentro del commands.cfg has incluido la llamada a perl o solo llamas al script?

  2. Llamo al script directamente. Cuando dices “llamada a Perl” supongo que te refieres a:

    perl mail.pl

    Gracias.

  3. Efectivamente llamando al script desde perl funciona bien!

    He hecho una pequena modificacion sobre tu script para poder utilizarlo con una conexion TLS. He usado el modulo Net::SMTP::TLS, y si a alguien le interesa también hay otro para SSL.

    #!/usr/bin/perl
    use Net::SMTP::TLS;
    $destinatario=$ARGV[0];
    $tipo=$ARGV[1];
    $host=$ARGV[2];
    $estado=$ARGV[3];
    $ip=$ARGV[4];
    $mailer = new Net::SMTP::TLS(
    ‘mail.server.com’,
    Hello => ‘client.midominio.com’,
    Port => ’587′,
    User => ‘usuario’,
    Password=> ‘contrasena’);
    $mailer->mail(‘usuario@midominio.com’);
    $mailer->to(“$destinatario”);
    $mailer->data;
    $mailer->datasend(“To: $destinatario\n”);
    $mailer->datasend(“Subject: ****NAGIOS**** $tipo: $host con estado $estado\n”);
    $mailer->datasend(“\n”);
    $mailer->datasend(“Notificacion de tipo: $tipo\n”);
    $mailer->datasend(“Equipo: $host ($ip)\n”);
    $mailer->datasend(“Estado actual: $estado\n”);
    $mailer->dataend;
    $mailer->quit;

    Otra pregunta mas. Me gustaria poder usar este script para notificar los servicios pero no funciona, los mensajes no me llegan y no sé porqué. Estoy cambiando algunas variables pero no encuentro ninguna logica al fallo, si le paso bien “$CONTACTEMAIL$” las demas variables dan igual, no?

    Gracias de nuevo!

    P.D. : perdon por los acentos y las enes, estoy en un teclado francés

  4. alguno pudo resolver como hacer para monitorear la memoria RAM… pero solo la RAM no la sumatoria de esta con la paginacion o memoria virtual…

    ejm: si un server tiene 8 gb que solo salgan esos 8gb y no 16 o 14 gb… ya que cuando la memoria RAM de ese servidor esta a full no me envia nada por estar al 70 % o menos. del Total de los 16gb…

  5. Hola,

    me gustaria saber como poder monitorear el número de usuarios que estan conectados a un servidor.

    Muchas gracias

  6. Hola,

    me gustaria saber si se puede controlar la capacidad de disco duro de una unidad mapeada en un servidor.

    Muchas gracias

  7. Es posible. Yo ahora mismo no monitorizo unidades mapeadas, sino directamente las unidades del servidor, pero para el caso puede servirte. Me he hecho un script en perl que genera un archivo con los discos y las capacidades (o los puntos de montaje en linux). Ese archivo lo subo al servidor de Nagios y cada con un plugin propio lo leo. Como te digo esto es un apaño que he hecho yo personalmente. Es posible que buscando en http://nagiosplugins.org/ encuentres algo que te pueda servir.

  8. Funciona contra Exchange server? Es que yo tengo exchange como servidores de correo, y me da el siguiente error, creo que es por que las cuentas con exchange o los inicios de sesion van de otra manera:

    [root@nagiossys01 libexec]# ./correo.pl “cuenta_de_mail@dominio.com” 1 EQUIPO ESTADO_OK 10.10.10.10 (es un ejemplo)
    Net::SMTP>>> Net::SMTP(2.31)
    Net::SMTP>>> Net::Cmd(2.29)
    Net::SMTP>>> Exporter(5.64_03)
    Net::SMTP>>> IO::Socket::INET(1.31)
    Net::SMTP>>> IO::Socket(1.32)
    Net::SMTP>>> IO::Handle(1.31)
    Net::SMTP=GLOB(0x9cc13f0)<<>> EHLO localhost.localdomain
    Net::SMTP=GLOB(0x9cc13f0)<<< 250-041-DB3MMR1-005.041d.mgd.msft.net Hello [10.153.9.198]
    Net::SMTP=GLOB(0x9cc13f0)<<< 250-SIZE
    Net::SMTP=GLOB(0x9cc13f0)<<< 250-PIPELINING
    Net::SMTP=GLOB(0x9cc13f0)<<< 250-DSN
    Net::SMTP=GLOB(0x9cc13f0)<<< 250-ENHANCEDSTATUSCODES
    Net::SMTP=GLOB(0x9cc13f0)<<< 250-STARTTLS
    Net::SMTP=GLOB(0x9cc13f0)<<< 250-X-ANONYMOUSTLS
    Net::SMTP=GLOB(0x9cc13f0)<<< 250-AUTH NTLM
    Net::SMTP=GLOB(0x9cc13f0)<<< 250-X-EXPS GSSAPI NTLM
    Net::SMTP=GLOB(0x9cc13f0)<<< 250-8BITMIME
    Net::SMTP=GLOB(0x9cc13f0)<<< 250-BINARYMIME
    Net::SMTP=GLOB(0x9cc13f0)<<< 250-CHUNKING
    Net::SMTP=GLOB(0x9cc13f0)<<< 250-XEXCH50
    Net::SMTP=GLOB(0x9cc13f0)<<< 250-XRDST
    Net::SMTP=GLOB(0x9cc13f0)<<>> MAIL FROM:
    Net::SMTP=GLOB(0x9cc13f0)<<>> RCPT TO:
    Net::SMTP: Unexpected EOF on command channel at ./correo.pl line 11

  9. El script está preparado para acceder a un servidor SMTP, dará igual la plataforma. Por lo del EOF, mira a ver si puede ser tema de la codificación del archivo.

  10. Muy buenas, tengo una configuración del fichero de envío similar a ésta:

    #!/usr/bin/perl
    use Net::SMTP;
    $destinatario=$ARGV[0];
    $tipo=$ARGV[1];
    $host=$ARGV[2];
    $estado=$ARGV[3];
    $ip=$ARGV[4];
    $smtp= Net::SMTP-> new (“smtp.ejemplo.es”);
    $smtp->mail(“nagios\@ejemplo.es”);
    $smtp->to(“$destinatario”);
    $smtp->data();
    $smtp->datasend(“To: $destinatario\n”);
    $smtp->datasend(“Subject: NAGIOS – $tipo: $host con estado $estado\n”);
    $smtp->datasend(“Notificacion de tipo: $tipo\n”);
    $smtp->datasend(“Equipo: $host ($ip)\n”);
    $smtp->datasend(“Estado actual: $estado\n”);
    $smtp->datasend();
    $smtp->quit;

    Pero envía los mensajes con el cuerpo del mensaje en el asunto. Me podrían ayudar?

    Muchas gracias

  11. Muy clara la descripcion del tema.

    Una consulta, al terminar de habilitar el envio de correos, recibo muchas notificaciones. (44 notificaciones de monitor critico en menos de 15 minutos)

    ¿Existe algun parametro que gatille el correo la primera vez que detecta el problema y no constantemente?

    Agradecido de antemano.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>