1 Desarrollo y administración de sistemas con Fabric Luis Alberto Pérez [email protected]
2 Administrando... Conviene automatizar el despliegue de apps, instalación de paquetes... Y en multiples servidores
3 Desarrollando... … quizás los obtenemos de un servidor de pruebas o pre ¿Y si trabajamos con varias versiones? Podemos querer desplegar solo ciertos componentes
4 ¿Qué es Fabric? ● Herramienta de línea de comandos y librería para facilitar la administración de sistemas y despliegue de aplicaciones a través de SSH. ● Python + Api muy simple + shell ● Ejecución local o remota, upload y download de ficheros ● Ejecución en múltiples múltiples hosts. ● Maneja peticiones de input a través de la shell remota (ej: petición de passwords), y cachea passwords
5 ● ¿Si ejecutamos comando de la shell, por qué usar Fabric? ● Reutilización de tareas tanto para local como para remoto ● Estructura y sintaxis de los scripts más amigable que bash “a pelo” # Así de facil! cpu_info = local("cat /proc/stat") print(cpu_info) # En máquinas remotas! cpu_info = run("cat /proc/stat") print(cpu_info) ● Mas adelante veremos cómo preconfigurar máquinas objetivo. Si no lo hacemos, Fabric nos pedirá en qué maquina(s) queremos ejecutar el comando
6 Herramienta fab ● Fabric trae la herramienta fab, con la que podemos ejecutar funciones (tareas) que escribamos en un fabfile.py # fabfile.py def hello(name="world"): print("Hello {0}".format(name)) $ fab hello Hello world Done.
7 Pasando parámetros ● Podemos pasar parámetros directamente a las tareas, posicionalmente o por nombre $ fab hello:luis Hello luis Done. $ fab hello:name=luis Hello luis Done. ● Con esto podemos construir herramientas de linea de comandos simples muy rápidamente
8 Especificando hosts ● Globalmente #fabfile.py env.hosts = ['192.168.0.11', '192.168.0.20', 'my_server'] ● Por tarea: #fabfile.py @hosts('user1@logserver1', 'logserver') def sysinfo(): cpu_info = run("cat /proc/stat") ● … o por linea de comandos: #fabfile.py $ fab diskusage --hosts=192.168.0.11
9 env y.fabricrc ● env es un diccionario en el que se pueden almacenar múltilples propiedades que se comparten en todas las tareas ● Aquí se pueden modificar variables como evv.hosts, env.cwd, env.keepalive, etc. ●.fabricrc es un fichero de propiedades (por defecto en el home del usuario) con pares clave=valor que aparecerán directamente en env (o modifican propiedades estandar), aunque por ahora está limitado a propiedades tipo String
10 Roles ● Forma de agrupar hosts #fabfile.py env.roledefs.update({ 'locales': ['192.168.1.1', '192.168.1.2'], 'logservers': ['logserver1, logserver2'] }) @roles('logservers') def diskusage(): pass ● También podemos especificar un rol desde linea de comandos #fabfile.py $ fab -R logservers diskusage
11 … más api ● Ejecutando con sudo: #fabfile.py put('bin/project.zip', '/tmp/project.zip') put('*.py', 'cgi-bin/') put('index.html', 'index.html', mode=0755) get('/path/to/remote_file.txt') ● Subiendo y bajando ficheros: #fabfile.py sudo("echo '192.168.0.2 importanthost' >> /etc/hosts") ● Capturando stdout: #fabfile.py pg_nstalled = “postgresql” in local(“dpkg -l”, capture=True) pg_installed_remote = “postgresql” in run(“dpkg -l”)
12 Context managers #fabfile.py with cd('/var/www'): run('ls')# ejecutará ls en /var/www run('du -sh') # du en /var/www (en otra ejecución distinta) with cd('/tmp'): #mismo pero en local run('ls')# ejecutará ls en /tmpvar/www with path('/usr/lib/mytool/bin', behavior='append'): run('mytool') with settings(warn_only=True): result = local('./inexistent_file', capture=True)
13 Organizando... ● Por defecto busca fabfile.py en el directorio actual de trabajo y recursivamente en los padres de éste ● Si se usan new-style tasks (@task) se pueden importar y anidar otros módulos que contengan tareas de fabric. #fabfile.py from diskutils import * @task def cpuinfo(): res = run("cat /proc/cpuinfo") #diskutils.py @task def diskstats(): res = run("cat /proc/diskstats") print(res)
14 Ejemplo: Proyecto SGSI ● En un script fabfile.py relativamente pequeño ~200 lineas ● Tareas para realizar todas combinaciones de: ● Borrado y creación de cluster postgres ● Migración de estructura de bd ● Build del proyecto (completo o solo ciertos módulos) ● Despliegue e instalación en entorno de desarrollo local (completo o solo ciertos módulos) ● Arranque y parada de servidor de prueba ● Además: ● Obtención de backups de BD de pruebas ● Carga de datos ● Apoyo al IDE para hacer hot deploy
15 ● Fabric es muy útil integrando aquellas herramientas que ya tengamos (make, mvn, scripts en bash...) #fabfile.py def lai(offline=True, cleanAssembly=True): local_assembly(offline, cleanAssembly) local_install()... def local_assembly(): with lcd(_get_proj_root()): local(mvn_command)... def remote_save_backup(backup_dir): with _remote_server_bin_dir(): run(backup_cmd) get(backup_file)... def local_startup(): with _local_server_bin_dir(): local("./nuxeoctl start")... Las tareas nio dejan de ser funciones python, así que se pueden encadenar
16 Extra: Cuisine ● Como ya hemos visto, Fabric es muy simple ● Librería para Fabric con tareas comunes ● Api también muy simple, crear tareas propias es muy fácil ● Únicamente testeado para Ubuntu :| #fabfile.py def editors_ensure(): package_ensure(["vim", "emacs"]) ● https://github.com/sebastien/cuisine
17 El Api de Cuisine: ● Manejo de ficheros y directorios (exists, read, write, append...) ● Manejo de usuarios y grupos (exists, create, ensure...) ● Manejo de paquetes (install, ensure, update) ● Manejo y transformación de texto ● Funciones para asegurar la presencia de texto y reemplazo del mismo, muy útil para actualizar configuraciones. ● Y otros como generación de claves RSA, asegurar que un proceso está corriendo, etc.
18 Referencias ● http://docs.fabfile.org/en/1.3.2/index.html http://docs.fabfile.org/en/1.3.2/index.html ● http://es.wikieducator.org/Curso_Python_DGA_2011/sistemas/admin_monitor http://es.wikieducator.org/Curso_Python_DGA_2011/sistemas/admin_monitor ● http://www.slideshare.net/ffunction/fabric-cuisine-and-watchdog-for-server-administration-in- python http://www.slideshare.net/ffunction/fabric-cuisine-and-watchdog-for-server-administration-in- python ● https://github.com/sebastien/cuisine https://github.com/sebastien/cuisine