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

Perl nagios

Embed Size (px)

Citation preview

Page 1: Perl nagios

muchas otras cosas. Si tenemosalguna necesidad especial nocubierta por los plugins estándar,podemos confeccionar uno que seadapte a nuestras necesidades.

Sólo 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

páginas Web en él. Si, por razo-nes de seguridad, la

instalación de Nagios en lamáquina local no tiene

acceso directo a la shelldel lado servidor, pode-mos instalar un agenteen la página Web.

Estadísticas E/SSi situamos el

script de agenteiostat.cgi (Listado

1) en el directorioCGI del servidor

Web que queremosinvestigar, nos seráde gran ayuda. Elscript se activa conuna petición HTTP,llama al comandoiostat de Linux, yenvía algunos

resultados al cliente, que resulta serun plugin de Nagios. El plugininterpreta entonces los resultados yusa el código de salida paraindicarle a Nagios si los valores soncorrectos o si ha encontradoproblemas (véase Tabla 1).

El script CGI, iostat.cgi, usa la fun-ción tap del módulo Sysadm::Installde CPAN para llamar al comando ios-tat con los valores 1 y 2 (línea 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 másinteresante para Nagios, ya queagrega el rendimiento por segundomientras se está ejecutando. Lacolumna %idle nos indica el tiempoque ha estado disponible la CPU, yiowait mide cuánto ha tenido queesperar la CPU al disco duro. Desdeel punto de vista del consumidor lomás 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 expresión regular$RE{num}{real} del repositorioRegexp::Common para analizar losvalores numéricos. A continuación

Puede que le sea familiar lasiguiente escena: escucha-mos la voz de nuestro

compañero (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 localización yresolución de problemas esmucho más fácil si dispo-nemos de un software quemonitoriza las funcionescríticas y nos muestraun amigable resumenbasado en Web comoel mostrado en laFigura 1.

La herramientaen software libreNagios es perfectapara este tipo demonitorización. Losdesarrolladores dis-ponen de una granlista de plugins en[2]. Los plugins pue-den ayudarnos amonitorizar páginasWeb, bases dedatos, redes y

DESARROLLO • Perl

54 Número 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 monitorización Nagios.

POR MICHAEL SCHILLI

Valor de Texto Significadosalida

0 OK Todo correcto1 WARNING Problema en servicio2 CRITICAL Problema en servicio

crítico3 UNKNOWN Problema con el

plugin

Tabla 1: Valores desalida

054-058_PERL20 15/9/06 20:32 Página 54

Page 2: Perl nagios

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 declaraciónde anchura cero, \G (línea 20), evitaque el motor de expresiones regula-res vuelva atrás al comienzo deltexto en cada ocasión y le indica quecontinúe la búsqueda tras la últimacoincidencia.

Carga LímiteEn 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 lalínea 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 estadocrítico. Para valores menores al 80%sólo muestra un aviso. Se aplica elmismo principio al valor iowait,pero los valores umbral son del 10 y20 por ciento en este caso.

El módulo Nagios::Clientstatus deCPAN descarga algo de trabajo delplugin al verificar si éste ha pasadotodos los parámetros requeridos. Elmétodo exitvalue también entiendecadenas como warning, más que elvalor numérico 1 del mundo deNagios. Si ejecutamos el plugin enlínea de comandos tecleando:

check_iostat -url=U

http://server/cgi/iostat.cgi

el plugin devuelve las siguienteslíneas de salida:

IOSTAT OK - user 2.99 U

nice 0.00 sys 0.00iowait 0.00 idle 96.52

Más tarde Nagios llamará al pluginde esta manera, interpretará losvalores de salida y mostrará el textoresultante del plugin en stdout.Nótese que Nagios::Clientstatusrequiere la versión 2.35 o superiorde Getopt::Long.

Integrar el PluginPara añadir el nuevo plugin a la insta-lación de Nagios, el administradordebe copiar el script check_iostat aldirectorio /usr/local/nagios/libexec ydarle permisos de ejecución. En laFigura 4 se añade una plantilla deno-minada ez-service a la configuración deNagios. Esto hace más sencillo añadirmás servicios posteriormente. En lasconfiguraciones de Nagios es unapráctica común definir plantillas, quese identifican con facilidad por susentradas register 0. Las definiciones delos servicios pueden usarse más tardepara añadir entradas especiales a lasplantillas.

La configuración define service dela Figura 4 define el nuevo servicioIostat. Se construye en base a laplantillas use ez-service, que defini-mos anteriormente, y acepta variosparámetros para ejecutar tests, noti-ficaciones por email y muchas otrascosas. Estas configuraciones deplantilla se heredan luego por ladefinición de servicio y pueden seranuladas en caso necesario. Algunasconfiguraciones y sus significados:la entrada notification_interval 0evita que Nagios envíe múltiplesemails 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é número 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 opción w se refiere aun aviso, u para desconocido, c decrítico y r de recuperación. Un prin-cipio similar se aplica ahost_notification_options: ademásde unknown y recovery, nos permitela opción d para caído.

El Servidor SolitarioSi el servidor Nagios está aislado delresto del mundo debido a un fallo enla red, obviamente no vamos a reci-bir ningún email a través deInternet. En este caso, el administra-dor recibe al menos un email derecuperación tan pronto como sehaya arreglado el problema. Nagiossoporta también administradores deeventos para definir acciones quellevar a cabo al detectar un error. Elsistema puede solucionar problemasde manera autónoma sin la interven-ción 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 configuración. La líneahost_name dreamhost en laconfiguración del ejemplo define elnombre del host, al que nos vamos areferir más tarde en la página devisualización de Nagios.

Perl • DESARROLLO

55Número 20W W W . L I N U X - M A G A Z I N E . E S

Figura 1: Esta página resumen de Nagios nos muestra que los tests locales han sido

completados con éxito, pero que el router y todo lo que está más allá, están inaccesibles.

054-058_PERL20 15/9/06 20:32 Página 55

Page 3: Perl nagios

comandos a ejecutar. La líneacheck_command puede tomarargumentos opcionales, que pasa acontinuación a la definición delcomando. Separada por un signo deexclamación, la URL de la líneacheck_command se pasa a ladefinición del comando iostat yreemplaza al parámetro desustitución $ARG1$.

El valor 24x7 de check_period ynotification_period requiere configu-raciones para definir la dirección deemail del administrador y la disponi-bilidad. Podemos encontrar unarchivo de ejemplo llamado ezna-gios.cfg en [1], y añadir una línea talque:

cfg_file=U

/usr/local/nagios/etc/eznagios.cfg

al archivo de configuración 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 están funcionando.

Calentito, calentito…check_temperature es otro ejemplo clarode plugin de cosecha propia para Nagios.El script (véase el Listado 3) contactauna base de datos round-robin en buscade la medida de temperatura indicada en[3], y nos alerta si la medida másreciente de la temperatura externa ointerna excede unos umbrales

específicos. En el clásico estilo deplugins de Nagios, acepta parámetros enlínea de comandos para los valoresumbral. Si realizamos la llamada:

check_temperature -warn=30 U-crit=35 -dsname=Inside

El parámetro de definición deservicio check_command especificacómo realizar la llamada al plugincheck_iostat. Sin embargo, lallamada no se realiza directamenteen la definición del servicio. En sulugar, usa un comando configuradoanteriormente por define commandpara especificar la línea de

DESARROLLO • Perl

56 Número 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 gráfico 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 Página 56

Page 4: Perl nagios

se dispara un aviso si la temperaturainterna sube por encima de los 30ºcentígrados. El umbral crítico es35º. La Figura 5 muestra varios

valores resul-tado y la salidadel plugin paradistintas confi-guraciones delos parámetros.

De un modosimilar al pluginIostat que hemosvisto anterior-mente, laentrada del ser-viciocheck_commandcheck_tempera-

ture!25!30!Inside pasa losparámetros 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 sección central de la coloridatabla de la Figura 1 muestra queambas temperaturas son bastantenormales: 18.8º C (internos) y 15.9ºC (externos). Al menos mi aparta-mento no está en llamas.

Perl • DESARROLLO

57Número 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 ycuánto ha estado esperando al disco duro.

Figura 4: Configuración 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<@$dsnames;

$i++) {33 if($dsnames->[$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 páginas HTML. Creamos elscript de arranque en /etc/rc.d/init.d, ygeneramos por último una configu-ración de ejemplo:

make installmake install-initmake install-config

Instalar Nagios

054-058_PERL20 15/9/06 20:32 Página 57

Page 5: Perl nagios

Afortunadamente, la distribución nosofrece una colección de archivos deejemplo que podemos editar. Para ello,simplemente renombramos los archivos.cfg-sample bajo /usr/local/nagios/etc a.cfg.

La instalación de Nagios no deberíaser accesible públicamente a través 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 señal HUP al servidorWeb, los usuarios autenticados puedenacceder a los datos medidos y las seriesde reportes en http://localhost/nagios

(véase Figura 1).Si la página

de Nagios estáubicada trasun firewall,y estamosseguros deque sólopuede

accedersepor usuarios

autorizados,podemos ignorar la autenticación ycomentar las líneas Require valid-user.En el archivo de configuración de

Nagios, cgi.cfg, las entradas del Listado 4permitirían a un usuario no autenticadoacceder a toda la información y coman-dos de servicio.

Dormir a Pierna SueltaTras realizar todos estos cambios en losarchivos de configuración, podría seruna buena idea verificar si laconfiguración 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-ción, 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. �

Instalación

El tarball de la distribución 2.0 de Nagiosestá disponible en la página Web delproyecto [4]. Tras desempaquetarla,podemos seguir las instrucciones delcuadro “Instalar Nagios” para conseguirun servidor Nagios operativo. Otrotarball [2] contiene los plugins estándarpara Nagios 2.0. Tenemos quedesempaquetar el tarball en/usr/local/nagios/libexec.

El principal obstáculo para echar aandar Nagios es la configuración. Trasinstalar la herramienta, el administradordebe crear al menos seis(!) archivos deconfiguración diferentes.

DESARROLLO • Perl

58 Número 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 artículo: http://www.

linux-magazine.es/Magazine/Downloads/20

[2] Plugins estándar para Nagios-2.0:http://prdownloads.sourceforge.net/nagiosplug/nagios-plugins-1.4.2.tar.gz

[3] Michael Schilli, “¿Está que arde?”,Número 18 de Linux Magazine edi-ción en castellano, pag. 46

[4] Nagios: http://www.nagios.org

RECURSOS

Figura 5: Resultados y valores del plugin de la temperatura con diferentes parámetros en líneade comandos.

Figura 6: Configuración del servidor Webpara Nagios.

054-058_PERL20 15/9/06 20:33 Página 58