Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Cosiendo Parches
La librera Fabric de Python hace que sea extremadamente fcil la creacin repetida de scripts de comandos sobre SSH para diversos servidores. POR FRANK WILES
abric [1] es una librera de Python impresionante, que facilita la codificacin de tareas comunes de los sistemas, convirtindolas en sencillas recetas. Chef y Puppet son dos herramientas muy potentes para entornos grandes y complicados, pero a menudo requieren demasiado trabajo para realizar simples configuraciones. Cada vez que tengo que ejecutar una serie de comandos juntos para realizar alguna tarea bsica, cambio de marcha y me creo una tarea con Fabric. La conversin de las tareas diarias de los administradores de sistemas en tareas de Fabric sirven de ayuda para aquellos que tienen que administrar diferentes sistemas. Todos mis proyectos pueden desplegarse por medio del comando fab deploy, ya est trabajando con una configuracin simple o compleja. Las tareas de Fabric se ejecutan con el comando fab. Originalmente slo dispona de unas cuantas funciones, pero con el paso del tiempo, ha crecido bastante, incluyendo muchas, hasta tal punto que podra reemplazar por completo tanto a Puppet como a Chef. Los beneficios y las funciones que incluyen Fabric son: Uso de la conexin SSH existente para acceder a los equipos. Si su usuario puede hacerlo, entonces Fabric tambin. Flexibilidad a la hora de incluir y excluir equipos para realizar ciertas tareas, ya
sea nombrndolos a mano o definiendo roles. Ejecucin en serie o paralela. Ejecucin local de los comandos, como un usuario en un equipo remoto o con sudo. Autodocumentado: si no se est seguro de lo que va a hacer, se pueden ver fcilmente los pasos que ir a realizar. Administracin simple de ficheros con el mdulo fabric.contrib.files.
Esta simple tarea ejecutar el comando uptime en cualquier equipo que se haya definido en la lnea de comandos, por ejemplo:
fab -H localhost uptime
Primeros Pasos
La instalacin de Fabric es sencilla con pip. Tan slo hay que ejecutar:
pip install Fabric
Se puede ver una lista con las tareas Fabric disponibles ejecutando fab -l. Aqu hay tareas al viejo estilo, de modo que se listar cualquier funcin definida. Sin embargo, se debera utilizar el nuevo estilo para definir las tareas, porque permite especificar qu funciones se encontrarn disponibles como tareas y cules para uso interno muestro un ejemplo utilizando el viejo estilo porque muchos documentos howto an lo usan. Tras introducir
from fabric.api import * def uptime(): run(uptime) @task def get_uptime(): uptime()
desde la lnea de comandos. Fabric busca un fichero denominado fabfile.py en el directorio actual o empezar a retroceder por el rbol de directorios en el que se encuentre buscndolo. Esta solucin facilita la separacin de diferentes tareas en diferentes carpetas para cada proyecto, sin embargo, se puede tambin especificar el fichero fabfile a utilizar con el parmetro -p. Para crear la primera tarea Fabric, vamos a teclear lo siguiente:
ejecutamos fab -l y ahora slo se mostrar la tarea get_uptime y se ocultar la funcin interna uptime (Figura 1). Para ejecutar
WWW.LINUX- MAGAZINE.ES
Nmero 87
45
DESARROLLO Python
Figura 1: Las tareas disponibles. Las funciones internas usadas por la tarea no se listan.
Este comando abre una conexin SSH con cada servidor listado, ejecuta el comando uptime y muestra los resultados (Listado 1). Se puede ajustar la cantidad de informacin que puede generar desde la lnea de comandos o en el propio cdigo (vase la documentacin [2]). Tener que definir los equipos cada vez es tedioso. Afortunadamente, Fabric facilita la labor. Aqu vamos a utilizar Fabric para realizar un simple despliegue basado en Git para un servidor web definiendo los equipos en los que debera ejecutarse junto con algunos comandos locales y remotos (Listado 2). La Figura 2 muestra cmo aparece en un terminal. Al contrario que con los comandos anteriores, se han definido internamente los equipos en los que deseamos que se ejecuten los comandos, de modo que para ejecutar esta tarea tan slo hay que ejecutar desde la lnea de comandos fab deploy. Lo primero que hay que hacer es utilizar el mdulo interno de Python datetime para construir la cadena para la etiqueta de Git,
que informa de la fecha especfica para desplegar una versin particular. Queremos slo tener que ejecutarlo una vez, de modo que se pone el decorador @runs_once. La tarea deploy() ejecuta la tarea tag_deployment y luego, en cada uno de los servidores web, Fabric se mete en el directorio /home/web/ y ejecuta los comandos que hay dentro de la sentencia with. Por ltimo, se reinicia Apache en cada servidor con sudo.
Roles
A menudo, conforme el nmero de servicios se incrementan, hace falta que algunos comandos se ejecuten slo en ciertos sistemas. En este escenario es donde aparecen los roles. Para definirlos, se puede utilizar env.roldefs de la siguiente forma:
env.hosts = [U foo1, foo2, foo3, U foo4] env.roledefs = { web: [foo1, foo2], db: [foo3, foo4], }
La ejecucin de fab deploy desde la lnea de comandos har: Ejecutar git pull desde el directorio /home/web/ en todos los equipos. Actualizar los requisitos de pip con el fichero /home/web/requirements.txt en todos los equipos. Ejecutar los comandos definidos en update_tables() en un equipo con el rol db. Reiniciar Apache en todos los equipos con el rol web.
Como en el otro ejemplo, suelo trabajar con aplicaciones basadas en Django principalmente y a menudo, necesito crear nuevas tablas de la base de datos y migrar las tablas existentes o crear nuevos formularios. Una tarea de migracin para este proceso actualizara cualquier requisito pip, instalara el cdigo nuevo en todos los equipos y ejecutara la creacin de las tablas y, por ltimo, migrara una vez a un equipo de base de datos (Listado 3).
A menudo, es ms eficiente realizar las acciones en paralelo, especialmente cuando se est tratando con varios servidores al mismo tiempo. En este sentido, las nuevas versiones de Fabric lo soportan. Para ejecutar una tarea existente en paralelo, tan slo hay que utilizar el parmetro -P:
fab -P deploy
Fabric proporciona los decoradores @serial y @parallel para ayudar a controlar mejor las operaciones de las tareas que tengan que ejecutarse en serie o en paralelo, con o sin el parmetro -P.
Pasando Argumentos
Muchas veces, el hecho de poder pasar valores como argumentos puede hacer que una tarea sea realmente reutilizable. Fabric permite pasar argumentos a una tarea por medio de:
46
Nmero 87
WWW.LINUX- MAGAZINE.ES
Python DESARROLLO
fab apache:restart
Este cdigo debera llamar a apache2 seguido por cualquier argumento que se le pase por la lnea de comandos en este caso, restart.
Ahora se podra importar desde cualquier fabfile.py importando el mdulo y Fabric se encargara de crear un espacio de nombres para l:
from fabric.api import * import apache @task def uptime(): run(uptime)
Espacios de Nombres
Con el nuevo estilo para las tareas (por ejemplo, utilizando el decorador @task), se pueden definir espacios de nombres para facilitar la programacin de libreras reutilizables de tareas o simplemente para dividir el cdigo en mdulos lgicos ms pequeos. Los espacios de nombres funcionan importando un mdulo de Python en el que se hayan definido las tareas. El trabajo con Apache es muy comn en mi mundo, de modo que sera conveniente poner estas tareas comunes en una librera para poder utilizarlas desde diferentes proyectos. Si tuviera un fichero apache.py,
from fabric.api import * @task def start(): sudo(/etc/init.d/ apache2 U start) @task
que podran ejecutarse con fab apache start desde la lnea de comandos. Se le pueden pasar argumentos y utilizar todas las caractersticas propias de Fabric a estas tareas, ya que esta solucin facilita la reorganizacin del cdigo en mdulos sin tener que llegar a tener un fabfile que ocupe miles de lneas.
WWW.LINUX- MAGAZINE.ES
Nmero 87
47
remoto. Aunque por defecto utiliza el formato de cadenas de Python, recomendamos encarecidamente utilizar la opcin para la librera Jinja2 Template, que es mucho ms potente. Adems, el uso de plantillas para los ficheros de configuracin ayuda a reducir el tiempo empleado en la configuracin y depuracin de los problemas del servidor.
mer comando ruidoso, ocultando cualquier salida. Las primeras opciones para la funcin hide(), running, le indica a Fabric que no muestre la salida del comando que se est ejecutando. Esta tarea entonces imprimir un mensaje de estado en rojo y ejecutar another-noisy-command, mostrando todas las salidas, ya que se encuentra fuera del bloque with. Para ejecutar una tarea para un nico rol, incluso si no se encuentra definido de esa forma en el cdigo, se utiliza el parmetro -R:
fab -R nombre_rol nombre_tarea
Otro truco til de Fabric consiste en la habilidad para pasar comandos arbitrarios al grupo de servidores o a los que pertenezcan a algn rol usando el parmetro . Todo lo que vaya detrs de los dos guiones se pasa a los servidores como el comando a ejecutar, por ejemplo:
fab -R web -- uptime
Ahora, ejecutando fab -l se listar complicated_steps como una accin pero se mostrar el comentario entre las triples comillas (tambin conocido como docstrings) junto a ella para refrescar nuestra memoria. Mostrando y ocultando o coloreando la salida, se puede controlar cmo las tareas generan sus resultados por pantalla. El cdigo del Listado 4 imprime una actualizacin del estado en verde y ejecuta el pri-
ejecutar el comando uptime en todos los servidores del rol web. Esta breve introduccin a Fabric no ha hecho ms que araar la superficie de todos sus posibles usos, pero espero que haya proporcionado una buena introduccin para que el lector siga profundizando por su cuenta.
RECURSOS
[1] Fabric: http://fabfile.org [2] Niveles de salida: http://docs.fabfile.org/en/1.4.2/usage/ output_controls.html#hiding-and-orshowing-output-levels [3] API de fichero Remoto: http://docs.fabfile.org/en/1.2.0/api/ contrib/files.hteml
48
Nmero 87
WWW.LINUX- MAGAZINE.ES