-
muchas otras cosas. Si tenemosalguna necesidad especial
nocubierta por los plugins estndar,podemos confeccionar uno que
seadapte a nuestras necesidades.
Slo por dar un ejemplo, Nagiospuede llevar a cabo tests para
verifi-car si un proveedor de hosting nosest dando un servidor con
suficien-tes recursos, en lugar de sobrecargarel servidor
albergando demasiadas
pginas Web en l. Si, por razo-nes de seguridad, la
instalacin de Nagios en lamquina local no tiene
acceso directo a la shelldel lado servidor, pode-mos instalar un
agenteen la pgina Web.
Estadsticas E/SSi situamos el
script de agenteiostat.cgi (Listado
1) en el directorioCGI del servidor
Web que queremosinvestigar, nos serde gran ayuda. Elscript se
activa conuna peticin HTTP,llama al comandoiostat de Linux, yenva
algunos
resultados al cliente, que resulta serun plugin de Nagios. El
plugininterpreta entonces los resultados yusa el cdigo de salida
paraindicarle a Nagios si los valores soncorrectos o si ha
encontradoproblemas (vase Tabla 1).
El script CGI, iostat.cgi, usa la fun-cin tap del mdulo
Sysadm::Installde CPAN para llamar al comando ios-tat con los
valores 1 y 2 (lnea 8).Debido al valor del intervalo de 1, yal
valor de contador de 2, mide elrendimiento de la CPU y de la E/Sdel
disco duro dos veces porsegundo y genera el resultado de laFigura
3.
El primer test nos da el valormedio desde el ltimo
reinicio,mientras que el segundo es msinteresante para Nagios, ya
queagrega el rendimiento por segundomientras se est ejecutando.
Lacolumna %idle nos indica el tiempoque ha estado disponible la
CPU, yiowait mide cunto ha tenido queesperar la CPU al disco duro.
Desdeel punto de vista del consumidor loms deseable es un valor
alto de%idle y un valor bajo de %iowait.
El script iostat.cgi del Listado 1 leela salida de iostat y
descarta el pri-mer conjunto de valores medidos.Para ello, usa la
expresin regular$RE{num}{real} del repositorioRegexp::Common para
analizar losvalores numricos. A continuacin
Puede que le sea familiar lasiguiente escena: escucha-mos la voz
de nuestro
compaero (definitivamente tecn-fobo) en el despacho
contiguogritando Mi Internet no funciona!Una posible respuesta
puede sercomprobar laboriosamente si el rou-ter est realmente
hablandocon nuestro proveedor o sipodemos acceder al servidorde
DNS. Pero la localizacin yresolucin de problemas esmucho ms fcil si
dispo-nemos de un software quemonitoriza las funcionescrticas y nos
muestraun amigable resumenbasado en Web comoel mostrado en laFigura
1.
La herramientaen software libreNagios es perfectapara este tipo
demonitorizacin. Losdesarrolladores dis-ponen de una granlista de
plugins en[2]. Los plugins pue-den ayudarnos amonitorizar
pginasWeb, bases dedatos, redes y
DESARROLLO Perl
54 Nmero 20 W W W . L I N U X - M A G A Z I N E . E S
Creamos nuestros propios plugins para Nagios
EL VIGILANTEPodemos crear un plugin en Perl para aprovechar la
potencia de la herramienta de monitorizacin Nagios.
POR MICHAEL SCHILLI
Valor de Texto Significadosalida
0 OK Todo correcto1 WARNING Problema en servicio2 CRITICAL
Problema en servicio
crtico3 UNKNOWN Problema con el
plugin
Tabla 1: Valores desalida
054-058_PERL20 15/9/06 20:32 Pgina 54
-
de la cabecera HTTP obligatoria,devuelve una cadena tal que
user2.99 nice 0.00 sys 0.00 iowait 0.00idle 96.52. La llamada
declaracinde anchura cero, \G (lnea 20), evitaque el motor de
expresiones regula-res vuelva atrs al comienzo deltexto en cada
ocasin y le indica quecontine la bsqueda tras la
ltimacoincidencia.
Carga LmiteEn la parte de Nagios, el plugin delListado 2 hace
uso de LWP::Simplepara llamar al script CGI que acaba-mos de ver en
el servidor, captura lalnea de salida y ejecuta split paradividir
la salida en campos paraguardarlos en el hash %values. Si
ladisponibilidad de la CPU es menordel 50%, el plugin reporta un
estadocrtico. Para valores menores al 80%slo muestra un aviso. Se
aplica elmismo principio al valor iowait,pero los valores umbral
son del 10 y20 por ciento en este caso.
El mdulo Nagios::Clientstatus deCPAN descarga algo de trabajo
delplugin al verificar si ste ha pasadotodos los parmetros
requeridos. Elmtodo exitvalue tambin entiendecadenas como warning,
ms que elvalor numrico 1 del mundo deNagios. Si ejecutamos el
plugin enlnea de comandos tecleando:
check_iostat -url=Uhttp://server/cgi/iostat.cgi
el plugin devuelve las siguienteslneas de salida:
IOSTAT OK - user 2.99 Unice 0.00 sys 0.00iowait 0.00 idle
96.52
Ms tarde Nagios llamar al pluginde esta manera, interpretar
losvalores de salida y mostrar el textoresultante del plugin en
stdout.Ntese que Nagios::Clientstatusrequiere la versin 2.35 o
superiorde Getopt::Long.
Integrar el PluginPara aadir el nuevo plugin a la insta-lacin de
Nagios, el administradordebe copiar el script check_iostat
aldirectorio /usr/local/nagios/libexec ydarle permisos de ejecucin.
En laFigura 4 se aade una plantilla deno-minada ez-service a la
configuracin deNagios. Esto hace ms sencillo aadirms servicios
posteriormente. En lasconfiguraciones de Nagios es unaprctica comn
definir plantillas, quese identifican con facilidad por susentradas
register 0. Las definiciones delos servicios pueden usarse ms
tardepara aadir entradas especiales a lasplantillas.
La configuracin define service dela Figura 4 define el nuevo
servicioIostat. Se construye en base a laplantillas use ez-service,
que defini-mos anteriormente, y acepta variosparmetros para
ejecutar tests, noti-ficaciones por email y muchas otrascosas.
Estas configuraciones deplantilla se heredan luego por ladefinicin
de servicio y pueden seranuladas en caso necesario.
Algunasconfiguraciones y sus significados:la entrada
notification_interval 0evita que Nagios enve mltiplesemails para
reportar un nico pro-blema. Los administradores puedenfijar
normal_check_interval paraespecificar el intervalo entre tests
deservicio, en minutos, ymax_check_attempts para especificarqu
nmero de tests permitimos quefallen antes de que nos lo
notifiqueNagios. service_notification_optionsespecifica qu cambios
en el estadode Nagios se nos deben notificar conun mensaje. La
opcin w se refiere aun aviso, u para desconocido, c decrtico y r de
recuperacin. Un prin-cipio similar se aplica
ahost_notification_options: ademsde unknown y recovery, nos
permitela opcin d para cado.
El Servidor SolitarioSi el servidor Nagios est aislado delresto
del mundo debido a un fallo enla red, obviamente no vamos a
reci-bir ningn email a travs deInternet. En este caso, el
administra-dor recibe al menos un email derecuperacin tan pronto
como sehaya arreglado el problema. Nagiossoporta tambin
administradores deeventos para definir acciones quellevar a cabo al
detectar un error. Elsistema puede solucionar problemasde manera
autnoma sin la interven-cin de un administrador.
Con Nagios 2.0, un servicio siem-pre se mapea a un host al que
se lecomprueba la disponibilidad inde-pendientemente. Las
especificacionesdel host requieren entradas en elarchivo de
configuracin. La lneahost_name dreamhost en laconfiguracin del
ejemplo define elnombre del host, al que nos vamos areferir ms
tarde en la pgina devisualizacin de Nagios.
Perl DESARROLLO
55Nmero 20W W W . L I N U X - M A G A Z I N E . E S
Figura 1: Esta pgina resumen de Nagios nos muestra que los tests
locales han sido
completados con xito, pero que el router y todo lo que est ms
all, estn inaccesibles.
054-058_PERL20 15/9/06 20:32 Pgina 55
-
comandos a ejecutar. La lneacheck_command puede tomarargumentos
opcionales, que pasa acontinuacin a la definicin delcomando.
Separada por un signo deexclamacin, la URL de la lneacheck_command
se pasa a ladefinicin del comando iostat yreemplaza al parmetro
desustitucin $ARG1$.
El valor 24x7 de check_period ynotification_period requiere
configu-raciones para definir la direccin deemail del administrador
y la disponi-bilidad. Podemos encontrar unarchivo de ejemplo
llamado ezna-gios.cfg en [1], y aadir una lnea talque:
cfg_file=U/usr/local/nagios/etc/eznagios.cfg
al archivo de configuracin nagios.cfg. Almismo tiempo,
eznagios.cfg define lostests de Nagios que nos indican
cuantoespacio en disco est ocupado y si el rou-ter y servidor de
DNS de nuestroproveedor estn funcionando.
Calentito, calentitocheck_temperature es otro ejemplo clarode
plugin de cosecha propia para Nagios.El script (vase el Listado 3)
contactauna base de datos round-robin en buscade la medida de
temperatura indicada en[3], y nos alerta si la medida msreciente de
la temperatura externa ointerna excede unos umbrales
especficos. En el clsico estilo deplugins de Nagios, acepta
parmetros enlnea de comandos para los valoresumbral. Si realizamos
la llamada:
check_temperature -warn=30 U-crit=35 -dsname=Inside
El parmetro de definicin deservicio check_command especificacmo
realizar la llamada al plugincheck_iostat. Sin embargo, lallamada
no se realiza directamenteen la definicin del servicio. En sulugar,
usa un comando configuradoanteriormente por define commandpara
especificar la lnea de
DESARROLLO Perl
56 Nmero 20 W W W . L I N U X - M A G A Z I N E . E S
Figura 2: Nagios nos muestra un grfico para indicarnos con qu
frecuencia ha sido imposible
acceder a un sistema.
01 #!/usr/bin/perl02 ##############################03 use
strict;04 use LWP::Simple;05 use Log::Log4perl qw(:easy);06 use
Nagios::Clientstatus;0708 my $version = 0.01;09 my $ncli =
Nagios::Clientstatus->new(10 help_subref =>11 sub { print
usage: $0
url\n },12 version =>
$version,13 mandatory_args => [ url
],14 );1516 my $url =
$ncli->get_given_arg(url);1718 my $data = get $url;1920
unless($data) {21 print Failed to get
$url\n;22 exit
$ncli->exitvalue(unknown);23 }2425 my %values = split ,
$data;2627 my $status =28 $values{idle} < 50 ?
critical :29 $values{idle} < 70 ?
warning :30 $values{iowait} > 20 ?
critical :31 $values{iowait} > 10 ?
warning :32 ok;3334 print IOSTAT , uc($status),
- $data\n;3536 exit
$ncli->exitvalue($status);
Listado 2: check_iostat
01 #!/usr/bin/perl -w02 use strict;03 use Sysadm::Install
qw(:all);0405 use CGI qw(:all);06 use Regexp::Common;07 use
Sysadm::Install qw(:all);0809 my($stdout, $stderr, $rc) =10 tap
iostat, 1, 2;1112 $stdout =~
/avg-cpu.*?avg-cpu/gs;1314 print header();1516 for my $key
(qw(user nice sys17 iowait idle))
{18 if($stdout =~19
/\G.*?($RE{num}{real})/gs) {20 printf %s %s , $key,
$1;21 }22 }
Listado 1: iostat.cgi
054-058_PERL20 15/9/06 20:32 Pgina 56
-
se dispara un aviso si la temperaturainterna sube por encima de
los 30centgrados. El umbral crtico es35. La Figura 5 muestra
varios
valores resul-tado y la salidadel plugin paradistintas
confi-guraciones delos parmetros.
De un modosimilar al pluginIostat que hemosvisto anterior-mente,
laentrada del ser-viciocheck_commandcheck_tempera-
ture!25!30!Inside pasa losparmetros 25, 30 e Inside alscript. La
entrada command corres-pondiente es algo como:
define command {command_namecheck_temperaturecommand_line
U$USER1$/check_temperature U-warn=$ARG1$ -crit=$ARG2$
U-dsname=$ARG3$}
La seccin central de la coloridatabla de la Figura 1 muestra
queambas temperaturas son bastantenormales: 18.8 C (internos) y
15.9C (externos). Al menos mi aparta-mento no est en llamas.
Perl DESARROLLO
57Nmero 20W W W . L I N U X - M A G A Z I N E . E S
Figura 3: iostat muestra el tiempo que ha estado la CPU sin
utilizar ycunto ha estado esperando al disco duro.
Figura 4: Configuracin de Nagios para el
nuevo plugin Iostat.
01 #!/usr/bin/perl -w02 ##############################03 use
strict;04 use RRDTool::OO;05 use Getopt::Std;06 use Pod::Usage;07
use Nagios::Clientstatus;0809 my $N = TEMPERATURE;1011 my $nc =
Nagios::Clientstatus->new(12 help_subref => sub {
pod2usage() },13 mandatory_args => [qw(14 crit warn dsname15
)],16 );1718 my $rrd = RRDTool::OO->new(19 file =>
/tmp/temperature.rrd );2021 my $dsnames =
$rrd->meta_data(dsnames);2223 $rrd->fetch_start(24 start
=> time() - 6*60,25 end => time()26 );2728 my $temp;2930
if(my($time, @values) =31
$rrd->fetch_next()) {32 for(my $i=0; $i[$i] eq34
$nc->get_given_arg(dsname)){
35 $temp = $values[$i];36 last;37 }38 }39 }4041 my $status =
ok;4243 if(! defined $temp) {44 $status = unknown;45 }46
elsif($temp >=47
$nc->get_given_arg(crit)) {48 $status = critical;49 }50
elsif($temp >=51
$nc->get_given_arg(warn)) {52 $status = warning;53 }5455
printf $N %s - %s: %s\n,56 uc($status),57
$nc->get_given_arg(dsname),58 defined $temp ?59 sprintf(%.1f,
$temp) :60 NODATA;6162 exit $nc->exitvalue($status);
Listado 3: check_temperature
Creamos un usuario y grupo paraNagios:
adduser nagioscd nagios-2.0./configuremake allInstalamos los
ejecutables, los scriptsCGI y las pginas HTML. Creamos elscript de
arranque en /etc/rc.d/init.d, ygeneramos por ltimo una
configu-racin de ejemplo:
make installmake install-initmake install-config
Instalar Nagios
054-058_PERL20 15/9/06 20:32 Pgina 57
-
Afortunadamente, la distribucin nosofrece una coleccin de
archivos deejemplo que podemos editar. Para ello,simplemente
renombramos los archivos.cfg-sample bajo /usr/local/nagios/etc
a.cfg.
La instalacin de Nagios no deberaser accesible pblicamente a
travs deInternet. Puede que queramos usar losajustes de la Figura 6
al configurar el ser-vidor Web de nuestro Nagios. Trasejecutar el
demonio de Nagios tecleando/etc/rc.d/init.d/nagios restart
(comoroot), y enviar una seal HUP al servidorWeb, los usuarios
autenticados puedenacceder a los datos medidos y las seriesde
reportes en http://localhost/nagios
(vase Figura 1).Si la pgina
de Nagios estubicada trasun firewall,y estamosseguros deque
slopuede
accedersepor usuarios
autorizados,podemos ignorar la autenticacin ycomentar las lneas
Require valid-user.En el archivo de configuracin de
Nagios, cgi.cfg, las entradas del Listado 4permitiran a un
usuario no autenticadoacceder a toda la informacin y coman-dos de
servicio.
Dormir a Pierna SueltaTras realizar todos estos cambios en
losarchivos de configuracin, podra seruna buena idea verificar si
laconfiguracin est libre de errores antesde intentar reiniciar el
demonio. Paraverificar la sintaxis:
cd /usr/local/nagiosbin/nagios -v etc/nagios.cfg
Una buena estrategia de monitoriza-cin, llevada a cabo de manera
fiablepor Nagios, garantiza al administradorel poder dormir a
pierna suelta, amenos que salten las alarmas, claro.Siempre ser
preferible despertarsepor un aviso de Nagios a nuestrobusca que
saltar de la cama por unusuario malhumorado que nos llamaen mitad
de la noche.
Instalacin
El tarball de la distribucin 2.0 de Nagiosest disponible en la
pgina Web delproyecto [4]. Tras desempaquetarla,podemos seguir las
instrucciones delcuadro Instalar Nagios para conseguirun servidor
Nagios operativo. Otrotarball [2] contiene los plugins estndarpara
Nagios 2.0. Tenemos quedesempaquetar el tarball
en/usr/local/nagios/libexec.
El principal obstculo para echar aandar Nagios es la
configuracin. Trasinstalar la herramienta, el administradordebe
crear al menos seis(!) archivos deconfiguracin diferentes.
DESARROLLO Perl
58 Nmero 20 W W W . L I N U X - M A G A Z I N E . E S
01 # cgi.cfg:02 default_user_name=guest0304
authorized_for_system_information=nagiosadmin,guest05
authorized_for_configuration_information=nagiosadmin,06
authorized_for_all_services=nagiosadmin,guest07
authorized_for_all_hosts=nagiosadmin,guest08
authorized_for_all_service_commands=nagiosadmin,guest09
authorized_for_all_host_commands=nagiosadmin,guest
Listado 4: Guest Access[1] Listados de este artculo:
http://www.
linux-magazine.es/Magazine/Downloads/20
[2] Plugins estndar para
Nagios-2.0:http://prdownloads.sourceforge.net/nagiosplug/nagios-plugins-1.4.2.tar.gz
[3] Michael Schilli, Est que arde?,Nmero 18 de Linux Magazine
edi-cin en castellano, pag. 46
[4] Nagios: http://www.nagios.org
RECURSOS
Figura 5: Resultados y valores del plugin de la temperatura con
diferentes parmetros en lneade comandos.
Figura 6: Configuracin del servidor Webpara Nagios.
054-058_PERL20 15/9/06 20:33 Pgina 58