Preparación para el examen 201 de LPI: Personalización y automatización de sistemas

Administración Nivel Intermedio (LPIC-2), Tema 213

En este tutorial, David Mertz y Brad Huntting lo preparan para rendir el Examen 201 de Intermediate Level Administration de ™Linux Professional Institute (LPIC-2) ®. Este tutorial, el séptimo de una serie de ocho tutoriales, describirá enfoques básicos de scripting y automatización de eventos de sistemas y tocará temas como la generación de informes y estados, la limpieza y el mantenimiento general.

David Mertz, Developer, Gnosis Software

David MertzDavid Mertz es Turing completo, pero probablemente no apruebe la Prueba de Turing. Para conocer más acerca de su vida, consulte su página Web personal. David escribe las columnas developerWorks Charming Python y XML Matters desde el año 2000. Consulte su libro Text Processing in Python [Procesamiento de texto en Python].



Brad Huntting, Mathematician, University of Colorado

Brad se encarga de la administración de sistemas UNIX®y de ingeniería de redes para varias compañías desde hace 14 años. En la actualidad, está cursando un Doctorado en Matemática Aplicada en la Universidad de Colorado en Boulder, y paga sus estudios trabajando en soporte de UNIX para el departamento de Ciencias de la Computación.



28-07-2010

Antes de comenzar

Conozca lo que puede aprender leyendo estos tutoriales y sepa cómo aprovecharlos al máximo.

Acerca de esta serie

Linux Professional Institute (LPI) otorga certificaciones en administración de sistemas Linux de nivel junior e intermedio. Para obtener cada nivel de certificación, deberá aprobar los exámenes LPI correspondientes.

Cada examen cubre varios temas, y cada tema posee un valor de ponderación. Estos valores indican la importancia relativa de cada tema. El examen incluirá más preguntas sobre los objetivos con mayor valor. A continuación se detallan los temas del examen 201 de LPI con sus respectivos valores:

Tema 201
Kernel de Linux (valor: 5).
Tema 202
Inicio del sistema (valor: 5).
Tema 203
Sistema de archivos (valor: 10).
Tema 204
Hardware (valor: 8).
Tema 209
Compartir archivos y servicios (valor: 8).
Tema 211
Mantenimiento de sistemas (valor: 4).
Tema 213
Personalización y automatización de sistemas (valor: 3). Tema abordado en este tutorial.
Tema 214
Solución de problemas (valor: 6).

Linux Professional Institute no patrocina ningún material o técnica de preparación para exámenes de terceros en particular. Para obtener más información, escriba a info@lpi.org.

Acerca de este tutorial

Bienvenido a "Personalización y automatización de sistemas", el séptimo de una serie de ocho tutoriales diseñados para prepararlo para rendir el examen 201 de LPI. En este tutorial, aprenderá varios enfoques básicos de scripting y automatización de eventos de sistemas y se tocarán temas como generación de informes y estados, limpieza y mantenimiento general.

Este tutorial está organizado en base a los objetivos LPI de este tema:

2.213.1 Automatización de tareas usando scripts (valor: 3)
Aprenderá a escribir scripts Perl simples que usen módulos cuando sea necesario, usar el modo taint de Perl para proteger datos e instalar módulos Perl desde Comprehensive Perl Archive Network (CPAN). Este objetivo incluye el uso de sed y awk en scripts, el uso de scripts para verificar la ejecución de procesos y la generación de alertas por e-mail o paginador cuando un proceso se deja de ejecutar. Se le pedirá escribir y programar scripts de ejecución automática para analizar registros de alertas y enviarlos por e-mail a los administradores; sincronizar archivos en varias máquinas usando rsync; monitorear cambios en archivos y generar e-mails de alerta; y escribir un script que notifique a los administradores cuando ciertos usuarios especificados inicien o cierren sesión.

Una categoría de tareas que debe gestionar el administrador de sistemas consiste en la automatización de eventos que deben ocurrir de forma periódica y la administración eficiente de otros eventos que ocurrirán esporádicamente. Las principales herramientas para la programación automática son cron y at. Tanto las tareas programadas regularmente como las iniciadas de forma manual pueden generarse por script con varios lenguajes como bash, awk, Perl o Python. Las herramientas de las utilidades de texto GNU suelen resultar útiles en varias tareas de procesamiento. Estas herramientas se utilizan principalmente dentro de scripts bash, debido a que los lenguajes más sofisticados como awk, Perl y Python tienen incorporadas casi todas las capacidades que ofrecen las utilidades de texto.

Requisitos previos

Para aprovechar al máximo este tutorial, deberá contar con conocimientos básicos de Linux y con un sistema Linux en funcionamiento donde pueda practicar los comandos aquí explicados.


Automatización de tareas periódicas

Configuración de cron

El daemon cron sirve para ejecutar comandos de forma periódica. Puede usar cron para una gran variedad de tareas programadas de limpieza y mantenimiento, y de administración de sistemas. Si existe un evento o tarea que deba ocurrir de forma regular, cron deberá controlarlo/a. Cron se activa una vez por minuto y verifica si debe realizar alguna acción, pero no puede realizar una tarea más de una vez por minuto (si necesita que una tarea se realice más de una vez por minuto, deberá usar un daemon en lugar de un trabajo cron). Cron registra sus acciones en la facilidad syslog.

Cron revisa varios puntos en busca de archivos de configuración que contengan configuraciones de entorno y comandos a ejecutar. El primero es /etc/crontab, que contiene tareas de sistemas. El directorio /etc/cron.d/ puede contener archivos de configuración múltiples, los cuales se consideran como complementarios a /etc/crontab. Si bien los paquetes especiales pueden agregar archivos (indicados en el nombre del paquete) a /etc/cron.d/, los administradores de sistemas deben usar /etc/crontab.

Las configuraciones cron de nivel de usuario se almacenan en /var/spool/cron/crontabs/$USER. Sin embargo, éstas siempre deben configurarse usando la herramienta crontab. Con crontab, los usuarios pueden programar sus propias tareas recurrentes.

Programación de trabajos diarios, semanales y mensuales

Los trabajos que deben ejecutarse en base a un cronograma diario, semanal o mensual simple – los cronogramas más usados – siguen una convención especial. Los directorios /etc/cron.daily/, /etc/cron.weekly/ y /etc/cron.monthly/ se crearon para contener conjuntos de scripts a ejecutarse diaria, semanal y mensualmente. Una forma sencilla de programar tareas de sistemas es agregar y eliminar scripts en estos directorios. Por ejemplo, para mantener un sistema que rota sus registros de forma diaria, uso el siguiente archivo de script:

Listado 1. Archivo de script diario de muestra
$ cat /etc/cron.daily/logrotate #!/bin/sh
test -x /usr/sbin/logrotate || exit 0 /usr/sbin/logrotate
/etc/logrotate.conf

Cron y anacron

Puede usar anacron para ejecutar comandos periódicamente en base a una frecuencia especificada en días. A diferencia de cron, anacron verifica si cada trabajo se ha ejecutado en los últimos n días (n es el período especificado para ese trabajo, en lugar de la coincidencia del tiempo actual con la ejecución programada). Si el trabajo no se ha ejecutado,anacron ejecuta su comando luego de transcurridos los minutos de espera especificados en el parámetro de retraso. Por consiguiente, en máquinas que no se ejecutan de forma continua, los trabajos periódicos se ejecutarán cuando la máquina esté en ejecución (obviamente, el tiempo exacto podría variar, pero la tarea no quedará sin realizarse).

Anacron lee una lista de trabajos del archivo de configuración /etc/anacrontab. Cada entrada de trabajo especifica un período en días, un retraso en minutos, un identificador único de trabajo y un comando shell. Por ejemplo, en un sistema Linux que mantengo, uso anacron para ejecutar trabajos diarios, semanales y mensuales aun cuando la máquina no se esté ejecutando en el momento del día programado:

Listado 2. Archivo de configuración anacron de muestra
$ cat /etc/anacrontab #
/etc/anacrontab: configuration file for anacron SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin # These replace cron's entries 1 5 cron.daily
nice run-parts --report /etc/cron.daily 7 10 cron.weekly nice run-parts --report
/etc/cron.weekly @monthly 15 cron.monthly nice run-parts --report
/etc/cron.monthly

Contenido de un crontab

El formato de /etc/crontab (o el contenido de los archivos /etc/cron.d/) es levemente diferente al de los archivos crontab de usuario. Básicamente, se suma un campo adicional a /etc/crontab que indica el usuario con que se ejecuta un comando. Este campo no es necesario en los archivos crontab de usuario porque estos ya se encuentran almacenados en un archivo que indica el nombre de usuario (/var/spool/cron/crontabs/$USER).

Cada línea de /etc/crontab establece una variable de entorno o configura un trabajo recurrente. Las líneas de comentarios y en blanco se ignoran. En los trabajos cron, los primeros cinco campos especifican tiempos de ejecución (a cada campo basado en cero puede corresponder una lista y/o rango). Los campos son: minuto, hora, día del mes, mes, día de la semana (separados por espacios o tabulaciones). Un asterisco (*) en cualquier posición indica que se admite cualquier valor. Por ejemplo, para ejecutar una tarea a la medianoche los martes y jueves de agosto a octubre, podría usar:

# line in /etc/crontab
0 0 * 7-9 2,5 root /usr/local/bin/the-task -opt1 -opt2

Uso de valores de programación especiales

Algunos patrones de programación comunes poseen nombres de acceso directo para reemplazar los primeros cinco campos:

@reboot
Ejecutar una vez en el inicio.
@yearly
Ejecutar una vez por año, "0 0 1 1 *".
@annually
Igual a @yearly.
@monthly
Ejecutar una vez por mes, "0 0 1 * *".
@weekly
Ejecutar una vez por semana, "0 0 * * 0".
@daily
Ejecutar una vez al día, "0 0 * * *".
@midnight
Igual a @daily.
@hourly
Ejecutar una vez por hora, "0 * * * *".

Por ejemplo, una configuración posible sería:

@hourly root /usr/local/bin/hourly-task
0,29 * * * * root /usr/local/bin/twice-hourly-task

Uso de crontab

Para configurar una tarea programada a nivel de usuario, use el comando crontab (en lugar del archivo /etc/crontab). Especificamente, crontab -e inicia un editor para modificar un archivo. Puede listar los trabajos actuales con crontab -l y eliminar el archivo con crontab -r. Otra posibilidad es especificar crontab -u user para programar tareas para un usuario en particular, aunque la opción predeterminada exige que usted realice la programación de tareas (existen restricciones de permisos).

Si en el sistema existe el archivo /etc/cron.allow, éste debe contener los nombres de todos los usuarios autorizados a programar trabajos. Si no existiese /etc/cron.allow, otra alternativa es no incluir a un usuario en el archivo /etc/cron.deny para que éste pueda programar tareas. Si no existiese ninguno de los dos archivos, todos los usuarios podrán usar crontab.


Automatización de tareas de una sola ejecución

Uso del comando at

Si desea programar una tarea para que se ejecute en el futuro, puede usar el comando at, el cual toma un comando de STDIN o de un archivo (usando la opción -f) y acepta descripciones de tiempo en un conjunto flexible de formatos.

Se usa una familia de comandos asociada con el comando at: atq lista las tareas pendientes; atrm elimina la tarea de la cola de pendientes; y batch funciona de manera similar a at, con excepción de que espera que el sistema tenga poca carga para ejecutar el trabajo.

Permisos

Al igual que /etc/cron.allow y /etc/cron.deny, el comando at cuenta con archivos /etc/at.allow y /etc/at.deny para la configuración de permisos. Si en el sistema existe el archivo /etc/at.allow, éste debe contener todos los usuarios autorizados a programar tareas. Si no existiese /etc/at.allow, otra alternativa es no incluir a un usuario en /etc/at.deny para que éste pueda programar tareas. Si no existiese ninguno de los dos archivos, todos los usuarios podrán usar at.

Especificaciones de tiempo

Consulte las páginas man de su versión de at para obtener más información. Puede especificar un HH:MM en particular para que ocurra un evento la próxima vez que llegue esa hora. (si esa hora del día ya pasó, el evento ocurrirá al día siguiente a la hora especificada). Si prefiere usar el sistema de 12 horas, puede agregar a.m. o p.m. Puede proporcionar un fecha en los siguientes formatos: MMDDYY, MM/DD/YY, DD.MM.YY o mes-nombre-día. También puede contar a partir de la hora actual con now + N units, donde N es un número y units son minutes (minutes), hours (horas), days (días) o weeks (semanas). Las palabras today(hoy) y tomorrow(mañana) mantienen el significado obvio, al igual que midnight(medianoche) y noon(mediodía), mientras que teatime son las 4 p.m. A continuación se ofrecen algunos ejemplos:

% at -f ./foo.sh 10am Jul 31 % echo 'bar -opt' | at 1:30 tomorrow

La definición exacta de la especificación de tiempo se encuentra en /usr/share/doc/at/timespec.


Consejos relacionados con scripts

Recursos externos

Existen muchos libros excelentes sobre awk, Perl, bash y Python. El coautor de este tutorial recomienda el de su autoría (como no podría ser der otra manera), Text Processing in Python [Procesamiento de texto en Python], como un buen punto de partida para aprender sobre scripting en Python.

La mayoría de los scripts que escribimos para la administración de sistemas tienen como objetivo la manipulación de texto, por ejemplo, extraer valores de registros y archivos de configuración o generar informes y resúmenes. Otros objetivos son limpiar elementos innecesarios del sistema y enviar notificaciones de tareas realizadas.

Los scripts más comunes para la administración de sistemas Linux se escriben en bash. Si bien bash cuenta con pocas capacidades incorporadas, éste permite utilizar herramientas externas (utilidades de archivos básicas como ls, find, rm y cd) y herramientas de texto (como la incluidas en las utilidades de texto GNU) con gran facilidad.

Consejos sobre Bash

Una configuración especialmente útil a incluir en los scripts bash que se ejecutan en base a un cronograma es el switch set -x, el cual hace eco de la ejecución de los comando a STDERR. Esto resulta útil cuando los scripts de depuración de errores no producen el efecto deseado. Otra opción interesante para la prueba es set -n, la cual hace que el script busque problemas de sintaxis en lugar de ejecutarse. Por supuesto, la versión -n no deberá programarse en un cron o at, pero puede ayudar al poner el sistema en funcionamiento.

Listado 3. Trabajo cron de muestra que ejecuta un script bash
#!/bin/bash exec
2>/tmp/my_stderr set -x # functional commands here

Esto redirige STDERR a un archivo y envía la ejecución de comandos a STDERR. Más adelante, revisar este archive podría ser útil.

La página man de bash es buena, aunque demasiado extensa. Resulta particularmente interesante conocer todas las opciones que acepta el set incorporado.

Una tarea común que puede efectuar un script de administración de sistemas es el procesamiento de un conjunto de archivos donde los archivos de interés se identifican usando el comando find. No obstante, podría surgir un problema cuando los nombres de archivos contienen espacios en blanco o caracteres de nueva línea. Estos espacios en blanco internos podrían afectar los bucles y el procesamiento de nombres de archivo que usted pueda realizar. Por ejemplo, estos dos comandos son diferentes:

% rm foo bar baz bam
% rm 'foo bar' 'baz bam'

El primero desvincula cuatro archivos (suponiendo que estos cuatro archivos existen en el sistema); el segundo elimina solamente dos archivos, cada uno de estos archivos incluye un espacio en el nombre. Los nombres de archivo con espacios son muy comunes en los contenidos multimedia.

Afortunadamente, la versión GNU del comando find tiene una opción -print0 para terminar cada resultado en NULL; y el comando xargs cuenta con un comando -0 correspondiente que toma a los argumentos como separados por valores NULL. Combinando estos comandos, es posible limpiar archivos perdidos cuyos nombres podrían contener espacios en blanco de la siguiente manera:

Listado 4. Limpieza de nombres de archivos con espacios
#!/bin/bash # Cleanup some old
files set -x find /home/dqm \( -name '*.core' -o -name '#*' \) -print0 \ | xargs
-0 rm -f

Modo taint de Perl

Perl ofrece un switch muy útil, -T, para activar el modo taint. En este modo, Perl toma una serie de precauciones de seguridad adicionales, de las cuales la más importante es que limita la ejecución de comandos que surjan de entradas externas. Si usa la ejecución sudo, el modo taint podría estar automáticamente activado. De todas formas, se recomienda iniciar los scripts de administración con:

#!/usr/local/bin/perl -T

A partir de este momento, todos los argumentos de la línea de comandos, variables de entorno, información local (ver perllocale), resultados de ciertas llamadas de sistemas (readdir(), readlink(), la variable de shmread(), los mensajes devueltos por msgrcv(), la contraseña, gcosy campos shell devueltos por llamadas getpwxxx()) y todas las entradas de archivos aparecerán marcadas como "corrompidos". Los datos corrompidos no podrán usarse directa o indirectamente en ningún comando que invoque un subshell ni en un comando que modifique archivos, directorios o procesos, salvo algunas pocas excepciones.

Es posible descorromper valores externos específicos buscando cuidadosamente patrones esperados:

Listado 5. Descorrupción de valores externos
if ($data =~ /^([-\@\w.]+)$/) { $data = $1; #
$data now untainted } else { die "Bad data in $data"; # log this somewhere
}

Paquetes Perl CPAN

Una de las ventajas de Perl es que ofrece un útil mecanismo de instalación de paquetes de soporte adicional denominado Comprehensive Perl Archive Network (CPAN). RubyGems cumple con una función similar a la realizada por este mecanismo. Lamentablemente, Python aún no cuenta con un mecanismo de instalación automatizada, pero su instalación predeterminada es más completa. Los lenguajes más sencillos como bash y awk no poseen componentes adicionales equivalentes.

La página man sobre el comando cpan es un buen comienzo, especialmente si piensa que la tarea que necesita ya ha sido creada por otros. Consulte los módulos candidatos en CPAN.

cpan viene tanto en formato de shell interactivo como de operación en la línea de comandos. Una vez configurado (ejecute el shell interactivo una vez para que se le solicite ingresar opciones de configuración), cpan administra las dependencias y ubicaciones de descargas de forma automatizada. Por ejemplo, supongamos que se le presenta una tarea de administración de sistemas que requiere el procesamiento de archivos de configuración en formato YAML (yaml Ain't Markup Language). Instalar el soporte de YAML será así de sencillo:

% cpan -i YAML # maybe with 'sudo' first

Luego de la instalación, en la parte superior de sus scripts podrá aparecer use YAML; en casos de capacidades para la cuales exista un paquete disponible.

Recursos

Aprender

  • En el Programa LPIC, listas de tareas, preguntas de muestra y objetivos detallados de los tres niveles de certificación en administración de sistemas Linux de Linux Professional Institute.
  • "Understanding Linux configuration files" [Conozca los archivos de configuración de Linux] (developerWorks, diciembre de 2001) le enseña a configurar archivos de configuración en un sistema Linux que controle permisos de usuarios, aplicaciones de sistemas, daemons, servicios y otras tareas administrativas dentro de un entorno multiusuario y multitarea.
  • El tutorial developerWorks "Using the GNU text utilities" [Uso de utilidades de texto GNU] (developerWorks, marzo de 2004) es una introducción a las utilidades de scripting.
  • Estos artículos sobre scripting en developerWorks le proporcionan una gran variedad de recursos sobre el uso de scripts para automatizar tareas en Linux.
  • Text Processing in Python [Procesamiento de texto en Python] de David Mertz, coautor de este tutorial, es una excelente fuente de scripts Python.
  • Encuentre más recursos para desarrolladores Linux en la zona Linux en developerWorks.

Obtener los productos y tecnologías

Comentar

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Linux
ArticleID=502720
ArticleTitle=Preparación para el examen 201 de LPI: Personalización y automatización de sistemas
publish-date=07282010