1. DESARROLLO • Perl
Creamos nuestros propios plugins para Nagios
EL VIGILANTE
Podemos crear un plugin en Perl para aprovechar la potencia de la herramienta de monitorización Nagios.
POR MICHAEL SCHILLI
P
uede que le sea familiar la muchas otras cosas. Si tenemos resultados al cliente, que resulta ser
siguiente escena: escucha- alguna necesidad especial no un plugin de Nagios. El plugin
mos la voz de nuestro cubierta por los plugins estándar, interpreta entonces los resultados y
compañero (definitivamente tecnó- podemos confeccionar uno que se usa el código de salida para
fobo) en el despacho contiguo adapte a nuestras necesidades. indicarle a Nagios si los valores son
gritando “¡Mi Internet no funciona!” Sólo por dar un ejemplo, Nagios correctos o si ha encontrado
Una posible respuesta puede ser puede llevar a cabo tests para verifi- problemas (véase Tabla 1).
comprobar laboriosamente si el rou- car si un proveedor de hosting nos El script CGI, iostat.cgi, usa la fun-
ter está realmente hablando está dando un servidor con suficien- ción tap del módulo Sysadm::Install
con nuestro proveedor o si tes recursos, en lugar de sobrecargar de CPAN para llamar al comando ios-
podemos acceder al servidor el servidor albergando demasiadas tat con los valores 1 y 2 (línea 8).
de DNS. Pero la localización y páginas Web en él. Si, por razo- Debido al valor del intervalo de 1, y
resolución de problemas es nes de seguridad, la al valor de contador de 2, mide el
mucho más fácil si dispo- instalación de Nagios en la rendimiento de la CPU y de la E/S
nemos de un software que máquina local no tiene del disco duro dos veces por
monitoriza las funciones acceso directo a la shell segundo y genera el resultado de la
críticas y nos muestra del lado servidor, pode- Figura 3.
un amigable resumen mos instalar un agente El primer test nos da el valor
basado en Web como en la página Web. medio desde el último reinicio,
el mostrado en la mientras que el segundo es más
Figura 1. Estadísticas E/S interesante para Nagios, ya que
La herramienta Si situamos el agrega el rendimiento por segundo
en software libre script de agente mientras se está ejecutando. La
Nagios es perfecta iostat.cgi (Listado columna %idle nos indica el tiempo
para este tipo de 1) en el directorio que ha estado disponible la CPU, y
monitorización. Los CGI del servidor iowait mide cuánto ha tenido que
desarrolladores dis- Web que queremos esperar la CPU al disco duro. Desde
ponen de una gran investigar, nos será el punto de vista del consumidor lo
lista de plugins en de gran ayuda. El más deseable es un valor alto de
[2]. Los plugins pue- script se activa con %idle y un valor bajo de %iowait.
den ayudarnos a una petición HTTP, El script iostat.cgi del Listado 1 lee
monitorizar páginas llama al comando la salida de iostat y descarta el pri-
Web, bases de iostat de Linux, y mer conjunto de valores medidos.
datos, redes y envía algunos Para ello, usa la expresión regular
$RE{num}{real} del repositorio
Regexp::Common para analizar los
valores numéricos. A continuación
Tabla 1: Valores de
salida
Valor de Texto Significado
salida
0 OK Todo correcto
1 WARNING Problema en servicio
2 CRITICAL Problema en servicio
crítico
3 UNKNOWN Problema con el
plugin
54 Número 20 WWW.LINUX- MAGAZINE.ES
2. Perl • DESARROLLO
La configuración define service de
la Figura 4 define el nuevo servicio
Iostat. Se construye en base a la
plantillas use ez-service, que defini-
mos anteriormente, y acepta varios
parámetros para ejecutar tests, noti-
ficaciones por email y muchas otras
cosas. Estas configuraciones de
plantilla se heredan luego por la
definición de servicio y pueden ser
anuladas en caso necesario. Algunas
configuraciones y sus significados:
la entrada notification_interval 0
evita que Nagios envíe múltiples
emails para reportar un único pro-
blema. Los administradores pueden
fijar normal_check_interval para
especificar el intervalo entre tests de
servicio, en minutos, y
max_check_attempts para especificar
qué número de tests permitimos que
Figura 1: Esta página resumen de Nagios nos muestra que los tests locales han sido fallen antes de que nos lo notifique
completados con éxito, pero que el router y todo lo que está más allá, están inaccesibles. Nagios. service_notification_options
especifica qué cambios en el estado
de la cabecera HTTP obligatoria, check_iostat -url= U de Nagios se nos deben notificar con
devuelve una cadena tal que user http://server/cgi/iostat.cgi un mensaje. La opción w se refiere a
2.99 nice 0.00 sys 0.00 iowait 0.00 un aviso, u para desconocido, c de
idle 96.52. La llamada declaración el plugin devuelve las siguientes crítico y r de recuperación. Un prin-
de anchura cero, G (línea 20), evita líneas de salida: cipio similar se aplica a
que el motor de expresiones regula- host_notification_options: además
res vuelva atrás al comienzo del IOSTAT OK - user 2.99 U de unknown y recovery, nos permite
texto en cada ocasión y le indica que nice 0.00 sys 0.00 la opción d para caído.
continúe la búsqueda tras la última iowait 0.00 idle 96.52
coincidencia. El Servidor Solitario
Más tarde Nagios llamará al plugin Si el servidor Nagios está aislado del
Carga Límite de esta manera, interpretará los resto del mundo debido a un fallo en
En la parte de Nagios, el plugin del valores de salida y mostrará el texto la red, obviamente no vamos a reci-
Listado 2 hace uso de LWP::Simple resultante del plugin en stdout. bir ningún email a través de
para llamar al script CGI que acaba- Nótese que Nagios::Clientstatus Internet. En este caso, el administra-
mos de ver en el servidor, captura la requiere la versión 2.35 o superior dor recibe al menos un email de
línea de salida y ejecuta split para de Getopt::Long. recuperación tan pronto como se
dividir la salida en campos para haya arreglado el problema. Nagios
guardarlos en el hash %values. Si la Integrar el Plugin soporta también administradores de
disponibilidad de la CPU es menor Para añadir el nuevo plugin a la insta- eventos para definir acciones que
del 50%, el plugin reporta un estado lación de Nagios, el administrador llevar a cabo al detectar un error. El
crítico. Para valores menores al 80% debe copiar el script check_iostat al sistema puede solucionar problemas
sólo muestra un aviso. Se aplica el directorio /usr/local/nagios/libexec y de manera autónoma sin la interven-
mismo principio al valor iowait, darle permisos de ejecución. En la ción de un administrador.
pero los valores umbral son del 10 y Figura 4 se añade una plantilla deno- Con Nagios 2.0, un servicio siem-
20 por ciento en este caso. minada ez-service a la configuración de pre se mapea a un host al que se le
El módulo Nagios::Clientstatus de Nagios. Esto hace más sencillo añadir comprueba la disponibilidad inde-
CPAN descarga algo de trabajo del más servicios posteriormente. En las pendientemente. Las especificaciones
plugin al verificar si éste ha pasado configuraciones de Nagios es una del host requieren entradas en el
todos los parámetros requeridos. El práctica común definir plantillas, que archivo de configuración. La línea
método exitvalue también entiende se identifican con facilidad por sus host_name dreamhost en la
cadenas como warning, más que el entradas register 0. Las definiciones de configuración del ejemplo define el
valor numérico 1 del mundo de los servicios pueden usarse más tarde nombre del host, al que nos vamos a
Nagios. Si ejecutamos el plugin en para añadir entradas especiales a las referir más tarde en la página de
línea de comandos tecleando: plantillas. visualización de Nagios.
WWW.LINUX- MAGAZINE.ES Número 20 55
3. DESARROLLO • Perl
específicos. En el clásico estilo de
plugins de Nagios, acepta parámetros en
línea de comandos para los valores
umbral. Si realizamos la llamada:
check_temperature -warn=30 U
-crit=35 -dsname=Inside
Listado 2: check_iostat
01 #!/usr/bin/perl
02 ##############################
03 use strict;
04 use LWP::Simple;
05 use Log::Log4perl qw(:easy);
06 use Nagios::Clientstatus;
07
08 my $version = “0.01”;
09 my $ncli =
Figura 2: Nagios nos muestra un gráfico para indicarnos con qué frecuencia ha sido imposible Nagios::Clientstatus->new(
acceder a un sistema. 10 help_subref =>
11 sub { print “usage: $0
El parámetro de definición de comandos a ejecutar. La línea urln” },
servicio check_command especifica check_command puede tomar 12 version =>
cómo realizar la llamada al plugin argumentos opcionales, que pasa a $version,
check_iostat. Sin embargo, la continuación a la definición del 13 mandatory_args => [ “url”
llamada no se realiza directamente comando. Separada por un signo de ],
en la definición del servicio. En su exclamación, la URL de la línea 14 );
lugar, usa un comando configurado check_command se pasa a la 15
anteriormente por define command definición del comando iostat y 16 my $url =
para especificar la línea de reemplaza al parámetro de $ncli->get_given_arg(“url”);
sustitución $ARG1$. 17
Listado 1: iostat.cgi El valor 24x7 de check_period y 18 my $data = get $url;
notification_period requiere configu- 19
01 #!/usr/bin/perl -w raciones para definir la dirección de 20 unless($data) {
02 use strict; email del administrador y la disponi- 21 print “Failed to get
03 use Sysadm::Install qw(:all); bilidad. Podemos encontrar un $urln”;
04 archivo de ejemplo llamado ezna- 22 exit
05 use CGI qw(:all); gios.cfg en [1], y añadir una línea tal $ncli->exitvalue(“unknown”);
06 use Regexp::Common; que: 23 }
07 use Sysadm::Install qw(:all);
24
08 cfg_file= U 25 my %values = split ‘ ‘, $data;
09 my($stdout, $stderr, $rc) = /usr/local/nagios/etc/eznagios.cfg 26
10 tap “iostat”, 1, 2;
27 my $status =
11 al archivo de configuración nagios.cfg. Al 28 $values{idle} < 50 ?
12 $stdout =~ mismo tiempo, eznagios.cfg define los “critical” :
/avg-cpu.*?avg-cpu/gs; tests de Nagios que nos indican cuanto 29 $values{idle} < 70 ?
13 espacio en disco está ocupado y si el rou- “warning” :
14 print header(); ter y servidor de DNS de nuestro 30 $values{iowait} > 20 ?
15 proveedor están funcionando. “critical” :
16 for my $key (qw(user nice sys
31 $values{iowait} > 10 ?
17 iowait idle)) Calentito, calentito… “warning” :
{ check_temperature es otro ejemplo claro 32 “ok”;
18 if($stdout =~ de plugin de cosecha propia para Nagios. 33
19 El script (véase el Listado 3) contacta 34 print “IOSTAT “, uc($status),
/G.*?($RE{num}{real})/gs) { una base de datos round-robin en busca “ - $datan”;
20 printf “%s %s “, $key, de la medida de temperatura indicada en 35
$1; [3], y nos alerta si la medida más 36 exit
21 } reciente de la temperatura externa o $ncli->exitvalue($status);
22 } interna excede unos umbrales
56 Número 20 WWW.LINUX- MAGAZINE.ES
4. Perl • DESARROLLO
valores resul-
tado y la salida define command {
del plugin para command_name
distintas confi- check_temper
guraciones de ature
los parámetros. command_line U
De un modo $USER1$/check_temperature U
similar al plugin -warn=$ARG1$ -crit=$ARG2$ U
Iostat que hemos -dsname=$ARG3$
visto anterior- }
mente, la
entrada del ser- La sección central de la colorida
vicio tabla de la Figura 1 muestra que
Figura 3: iostat muestra el tiempo que ha estado la CPU sin utilizar y
cuánto ha estado esperando al disco duro. check_command ambas temperaturas son bastante
check_tempera- normales: 18.8º C (internos) y 15.9º
se dispara un aviso si la temperatura ture!25!30!Inside pasa los C (externos). Al menos mi aparta-
interna sube por encima de los 30º parámetros 25, 30 e “Inside” al mento no está en llamas.
centígrados. El umbral crítico es script. La entrada command corres-
35º. La Figura 5 muestra varios pondiente es algo como:
Listado 3: check_temperature
01 #!/usr/bin/perl -w $i++) {
02 ############################## 33 if($dsnames->[$i] eq
03 use strict; 34
04 use RRDTool::OO; $nc->get_given_arg(“dsname”))
05 use Getopt::Std; {
06 use Pod::Usage; 35 $temp = $values[$i];
07 use Nagios::Clientstatus; 36 last;
08 37 }
09 my $N = “TEMPERATURE”; 38 }
10 39 }
11 my $nc = 40
Nagios::Clientstatus->new( 41 my $status = “ok”;
12 help_subref => sub { 42
pod2usage() }, 43 if(! defined $temp) {
13 mandatory_args => [qw( 44 $status = “unknown”;
14 crit warn dsname 45 }
15 )], 46 elsif($temp >=
16 ); 47
17 $nc->get_given_arg(“crit”)) { Figura 4: Configuración de Nagios para el
18 my $rrd = RRDTool::OO->new( 48 $status = “critical”; nuevo plugin Iostat.
19 file => 49 }
“/tmp/temperature.rrd” ); 50 elsif($temp >= Instalar Nagios
20 51
21 my $dsnames = $nc->get_given_arg(“warn”)) { Creamos un usuario y grupo para
$rrd->meta_data(“dsnames”); 52 $status = “warning”; Nagios:
22 53 } adduser nagios
23 $rrd->fetch_start( 54 cd nagios-2.0
24 start => time() - 6*60, 55 printf “$N %s - %s: %sn”, ./configure
25 end => time() 56 uc($status), make all
26 ); 57 Instalamos los ejecutables, los scripts
27 $nc->get_given_arg(“dsname”), CGI y las páginas HTML. Creamos el
28 my $temp; 58 defined $temp ? script de arranque en /etc/rc.d/init.d, y
29 59 sprintf(“%.1f”, $temp) : generamos por último una configu-
30 if(my($time, @values) = 60 “NODATA”; ración de ejemplo:
31 61 make install
$rrd->fetch_next()) { 62 exit $nc->exitvalue($status); make install-init
32 for(my $i=0; $i<@$dsnames; make install-config
WWW.LINUX- MAGAZINE.ES Número 20 57
5. DESARROLLO • Perl
Figura 5: Resultados y valores del plugin de la temperatura con diferentes parámetros en línea
de comandos.
Instalación
Afortunadamente, la distribución nos
Figura 6: Configuración del servidor Web
El tarball de la distribución 2.0 de Nagios ofrece una colección de archivos de para Nagios.
está disponible en la página Web del ejemplo que podemos editar. Para ello,
proyecto [4]. Tras desempaquetarla, simplemente renombramos los archivos Nagios, cgi.cfg, las entradas del Listado 4
podemos seguir las instrucciones del .cfg-sample bajo /usr/local/nagios/etc a permitirían a un usuario no autenticado
cuadro “Instalar Nagios” para conseguir .cfg. acceder a toda la información y coman-
un servidor Nagios operativo. Otro La instalación de Nagios no debería dos de servicio.
tarball [2] contiene los plugins estándar ser accesible públicamente a través de
para Nagios 2.0. Tenemos que Internet. Puede que queramos usar los Dormir a Pierna Suelta
desempaquetar el tarball en ajustes de la Figura 6 al configurar el ser- Tras realizar todos estos cambios en los
/usr/local/nagios/libexec. vidor Web de nuestro Nagios. Tras archivos de configuración, podría ser
El principal obstáculo para echar a ejecutar el demonio de Nagios tecleando una buena idea verificar si la
andar Nagios es la configuración. Tras /etc/rc.d/init.d/nagios restart (como configuración está libre de errores antes
instalar la herramienta, el administrador root), y enviar una señal HUP al servidor de intentar reiniciar el demonio. Para
debe crear al menos seis(!) archivos de Web, los usuarios autenticados pueden verificar la sintaxis:
configuración diferentes. acceder a los datos medidos y las series
de reportes en http://localhost/nagios cd /usr/local/nagios
(véase Figura 1). bin/nagios -v etc/nagios.cfg
Si la página
de Nagios está Una buena estrategia de monitoriza-
ubicada tras ción, llevada a cabo de manera fiable
un firewall, por Nagios, garantiza al administrador
y estamos el poder dormir a pierna suelta, a
seguros de menos que salten las alarmas, claro.
que sólo Siempre será preferible despertarse
puede por un aviso de Nagios a nuestro
accederse busca que saltar de la cama por un
por usuarios usuario malhumorado que nos llama
autorizados, en mitad de la noche. I
podemos ignorar la autenticación y
comentar las líneas Require valid-user.
En el archivo de configuración de RECURSOS
[1] Listados de este artículo: http://www.
Listado 4: Guest Access linux-magazine.es/Magazine/
Downloads/20
01 # cgi.cfg:
02 default_user_name=guest [2] Plugins estándar para Nagios-2.0:
http://prdownloads.sourceforge.net/
03
nagiosplug/nagios-plugins-1.4.2.tar.
04 authorized_for_system_information=nagiosadmin,guest
gz
05 authorized_for_configuration_information=nagiosadmin,
[3] Michael Schilli, “¿Está que arde?”,
06 authorized_for_all_services=nagiosadmin,guest
Número 18 de Linux Magazine edi-
07 authorized_for_all_hosts=nagiosadmin,guest
ción en castellano, pag. 46
08 authorized_for_all_service_commands=nagiosadmin,guest
[4] Nagios: http://www.nagios.org
09 authorized_for_all_host_commands=nagiosadmin,guest
58 Número 20 WWW.LINUX- MAGAZINE.ES