
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
¿ En las lineas siguientes donde pone destinatario hay que poner la cuenta de mail donde quieres
que lleguen los correos ?
$smtp->to(“$destinatario”);
$smtp->datasend(“To: $destinatario\n”);
$destinatario es el argumento que le pasa nagios a éste script. Realmente los destinatarios se definen en los ficheros de configuración de Nagios.
Buen dia:
En este caso, “smtp.ejemplo.es” es el correo Notes que uso para salir por SMTP?, otra pregunta, mail (“nagios\@ejemplo.es”) es la cuenta de correo de quien recibe??? o de quien envia???
Otra duda:
En que archivo de .cfg se agregan las lineas de “notificar host” he probado con varios y nada.
Gracias por su ayuda.
Te voy a intentar contestar de memoria, ya que no tengo los ficheros delante y hace tiempo que no los modifico. Vayamos por partes:
smtp.ejemplo.es -> es el servidor de SMTP que enviará los correos de aviso
nagios@ejemplo.es -> es la dirección origen del correo
La dirección de quien lo recibe se le pasa como parámetro al script.
Sobre el tema de los ficheros, no hace falta que esté en un fichero determinado, lo que hace falta es que esté bien definida toda la cadena. Necesitas tener un contacto bien definido, un grupo para el contacto, el comando, y un host que llame a ese comando cuando falle. Si tienes los ficheros de configuración inicial de nagios, lo mejor que puedes hacer es echarles un vistazo para segir un poco el hilo de todo lo que debes configurar.
Muchas gracias por el cometario, lo estoy revisando, agrege las configuracion pero parece que el error esta en:
$smtp= Net::SMTP-> new (“smtp.miempresa.com.mx”);
$smtp->mail(“nagios@miempresa.com.mx”);
Saludos
Cuando en mi empresa pusimos esto a funcionar, el servidor SMTP permitía iniciar sesión de manera anónima, sin dar un usario y una contraseña. Si el servidor de tu empresa no lo permite, ahí puede estar el problema (si no lo está todavía, te aseguro que ya aparecerá).
Creo que un no funciona, tengo duda si de la siguiente linea es correcta su sintaxis.
$smtp= Net::SMTP-> new (“smtp.mailserv.micompañia.com.mx”);
o tendria que ser:
$smtp= Net::SMTP-> new smtp.mailserv.micompañia.com.mx;
Muchas gracias de antemano por la ayuda.
Saludos. El problema que yo tengo, es que mi servidor de SMTP no deja enviar e-mail anonimamente. Sino que cada MTA tiene que autenticarse con mi servidor.
Existe la manera de decirle a Nagios que autientique con un usuario y una contraseña en concreto. Gracias.
Maths, tu problema es con el script, no con el Nagios. Lo que habría que hacer es añadir al script lo necesario para que se autentifique ante el servidor SMTP. Yo tengo pendiente hacer lo mismo, pero todavía no he tenido tiempo de ponerme a ello.
Por fin me he puesto con el tema y ya he cambiado el script para que envíe correos mediante un servidor SMTP 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
Amigo mi duda es, Cada implementacion de codigo en que archivo debe de ser implementado por ejemplo contacts.cfg contiene los contactos de email, pero no se donde si ud se refiere que en el mismo archivo debe de ir el command!! muchas gracias!
Hola Milton
El tema de los ficheros de configuración es totalmente personal. Bien podrías configurarlo todo en un mismo fichero, pero ¿que utilidad tendría eso? Lo que debes hacer es configurar cada tipo de “objeto” en un fichero distinto. Puedes agrupar los comandos en un fichero, los horarios en otro, los usuarios en otro distinto o juntar usuarios y horarios, equipos y servicios… Eso es elección tuya. Obviamente es mejor organizarlo de alguna manera que a la hora de editar sea sencilla.
amigo intente realizar lo del debug y me salio este error
[root@monitor tmp]# ./correo.pl milton_mnltech@hotmail.com error equipo estado ip
-bash: ./correo.pl: Permission denied
Pues los correos no quieren enviar, no se que hacer, pues he configurado todo como dice aca y no me salen los correos
gracias!
Pregunto este pedazo de codigo no es nesario tener el puerto ??
$smtp= Net::SMTP->new(’smtp.ejemplo.com’);
A lo primero que pones, eso se debe a que al script no le has dado permisos de ejecución.
Lo segundo que me comentas, en principio el puerto es el 25, con lo que mientras todo sea estandar, no deberías tener que cambiar nada.
Primero que nada gracias por el aporte
Estimado. tengo uan consulta, he configurado el envio de mail y estoy usando en mi red interna el smtp de un windows 2003, reedireccionado y funciona las notificaciones sin mayores problemas.
lo que si mi duda es para el ejemplo al momento que me llega a mi correo laboral o cualquiera.
el mail va quedando en la carpeta queue y siempre son los del nagios he hecho la prueba y lo he corroborado, pero los otros mail originados desde la intranet, etc (o de algun equipo en la red) no se quedan atorados en aquella carpeta, lo malo de eso es que solo me queda parar el servicio smtp por algunos segundos para eliminarlos y volver a iniciar el servicio…
alguna idea de eso si llegan a mi cuenta por que aun asi siguen encolados?????
Saludos y espero una pronta respuesta …
leo