Perl Nagi Os

5
muchas otras cosas. Si tenemos alguna necesidad especial no cubierta por los plugins estándar, podemos confeccionar uno que se adapte a nuestras necesidades. Sólo por dar un ejemplo, Nagios puede llevar a cabo tests para verifi- car si un proveedor de hosting nos está dando un servidor con suficien- tes recursos, en lugar de sobrecargar el servidor albergando demasiadas páginas Web en él. Si, por razo- nes de seguridad, la instalación de Nagios en la máquina local no tiene acceso directo a la shell del lado servidor, pode- mos instalar un agente en la página Web. Estadísticas E/S Si situamos el script de agente iostat.cgi (Listado 1) en el directorio CGI del servidor Web que queremos investigar, nos será de gran ayuda. El script se activa con una petición HTTP, llama al comando iostat de Linux, y envía algunos resultados al cliente, que resulta ser un plugin de Nagios. El plugin interpreta entonces los resultados y usa el código de salida para indicarle a Nagios si los valores son correctos o si ha encontrado problemas (véase Tabla 1). El script CGI, iostat.cgi , usa la fun- ción tap del módulo Sysadm::Install de CPAN para llamar al comando ios- tat con los valores 1 y 2 (línea 8). Debido al valor del intervalo de 1, y al valor de contador de 2, mide el rendimiento de la CPU y de la E/S del disco duro dos veces por segundo y genera el resultado de la Figura 3. El primer test nos da el valor medio desde el último reinicio, mientras que el segundo es más interesante para Nagios, ya que agrega el rendimiento por segundo mientras se está ejecutando. La columna %idle nos indica el tiempo que ha estado disponible la CPU, y iowait mide cuánto ha tenido que esperar la CPU al disco duro. Desde el punto de vista del consumidor lo más deseable es un valor alto de %idle y un valor bajo de %iowait . El script iostat.cgi del Listado 1 lee la salida de iostat y descarta el pri- mer conjunto de valores medidos. Para ello, usa la expresión regular $RE{num}{real} del repositorio Regexp::Common para analizar los valores numéricos. A continuación P uede que le sea familiar la siguiente escena: escucha- mos la voz de nuestro compañero (definitivamente tecnó- fobo) en el despacho contiguo gritando “¡Mi Internet no funciona!” Una posible respuesta puede ser comprobar laboriosamente si el rou- ter está realmente hablando con nuestro proveedor o si podemos acceder al servidor de DNS. Pero la localización y resolución de problemas es mucho más fácil si dispo- nemos de un software que monitoriza las funciones críticas y nos muestra un amigable resumen basado en Web como el mostrado en la Figura 1. La herramienta en software libre Nagios es perfecta para este tipo de monitorización. Los desarrolladores dis- ponen de una gran lista de plugins en [2]. Los plugins pue- den ayudarnos a monitorizar páginas Web, bases de datos, redes y DESARROLLO • Perl 54 Número 20 WWW.LINUX - MAGAZINE.ES 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 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 Tabla 1: Valores de salida

description

na

Transcript of Perl Nagi Os

  • 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