SlideShare una empresa de Scribd logo
1 de 47
Fabric 
más allá de lo básico 
PyConES 2014 - Zaragoza 
Alejandro E. Brito Monedero - @ae_bm
¿Quién soy? 
Mi nombre debe salir en el programa 
Con “estudios” en Ciencias de la Computación 
Más de 8 años trabajando como sysadmin / 
devops / SRE / <poner etiqueta tonta aquí> 
Más info en http://bit.ly/1sT7bLw 
Dejar en la puerta todas las expectativas que 
tengas, por favor
Checklist 
¿Qué es Fabric? 
Primeros pasos 
Subiendo el nivel 
Usar Fabric como biblioteca 
(Gracias Andrey)
¿Qué es Fabric? 
Fabric es una biblioteca de Python (2.5-2.7) y herramienta 
de línea de comandos para facilitar el uso de SSH para el 
despliegue de aplicaciones o tareas de administración de 
sistemas. Ya sabes de forma pythonica 
La estructura de algo / Tela / Un club nocturno en Londres / 
Un proxy para toysql 
http://www.fabfile.org/en/latest/
¿Qué es Fabric? 
Y python3 ?
¿Qué es Fabric? 
¡Calma! Se está cocinando Fabric 2 y 
bibliotecas como invoke 
http://www.fabfile.org/en/latest/roadmap.html 
#invoke-fabric-2-x-and-patchwork 
http://www.pyinvoke.org/ 
Todo esto está en desarrollo y como sabrán 
a los sysadmin se nos juzga por la 
estabilidad de los sistemas
Primeros pasos 
Instalar 
pip install fabric 
Crear un fabfile.py 
from fabric.api import run 
def host_type(): 
run('uname -s')
Primeros pasos 
Ejecutar 
fab -H host host_type 
[host] run: uname -s 
[host] out: Linux
Primeros pasos 
Un poco más del API de Fabric 
local 
sudo 
settings 
cd 
env.hosts
Subiendo el nivel
Subiendo el nivel 
Usando Fabric como Func / Mcollective / Ansible command 
fab -H web01,web02 -- "cd /var/www && pwd" 
[web01] Executing task '<remainder>' 
[web01] run: cd /var/www && pwd 
[web01] out: /var/www 
[web01] out:
Subiendo el nivel 
Usando Fabric como Func / Mcollective / Ansible 
command 
[web02] Executing task '<remainder>' 
[web02] run: cd /var/www && pwd 
[web02] out: /var/www 
[web02] out: 
Done.
Subiendo el nivel 
Usando el decorador task 
Antes 
from fabric.api import run 
def private(): 
run('pwd') 
def public(): 
# preparar cosas 
private()
Subiendo el nivel 
Usando el decorador task 
Antes 
fab -l 
Available commands: 
private 
public
Subiendo el nivel 
Usando el decorador task 
Después 
from fabric.api import run, task 
def private(): 
run('pwd') 
@task 
def public(): 
# preparar cosas 
private()
Subiendo el nivel 
Usando el decorador task 
Después 
fab -l 
Available commands: 
public
Subiendo el nivel 
Documentando las funciones 
from fabric.api import task 
@task 
def deploy_stuff(version): 
'''Deploy the specified version of stuff 
Keyword arguments: 
version -- version to deploy
Subiendo el nivel 
Documentando las funciones 
Example: 
$ fab deploy:release_X.Y.Z 
'''
Subiendo el nivel 
Documentando las funciones 
fab -l 
Available commands: 
deploy_stuff Deploy the 
specified version of stuff
Subiendo el nivel 
Documentando las funciones 
fab -d deploy_stuff 
Displaying detailed information for 
task 'deploy_stuff': 
Deploy the specified version of 
stuff
Subiendo el nivel 
Documentando las funciones 
Keyword arguments: 
version -- version to deploy 
Example: 
$ fab deploy:release_X.Y.Z
Subiendo el nivel 
Decorador execute 
from fabric.api import cd, execute, 
sudo, task 
def update_code(version, code_path, 
user='root'): 
'''Update code''' 
...
Subiendo el nivel 
Decorador execute 
@task 
def deploy_stuff(version): 
'''Deploy the specified version 
of stuff 
...
Subiendo el nivel 
Decorador execute 
execute(update_code, 
hosts=['web01', 'web02'], 
version=version, 
user='root', 
code_path='path')
Subiendo el nivel 
Decorador execute 
Para que execute funcione correctamente las 
tareas llamadas por execute no deben tener 
hosts asociados, sino al llamar la tarea se 
ejecutara múltiples veces, se puede evitar 
usando el decorador runs_once
Subiendo el nivel 
Decorador execute 
... 
env.use_ssh_config = True 
@task 
@hosts('web01', 'web02') 
def alpha(): 
execute(beta)
Subiendo el nivel 
Decorador execute 
@hosts('web03', 'web04') 
def beta(): 
execute(gamma) 
def gamma(): 
run('hostname')
Subiendo el nivel 
Decorador execute 
fab alpha 
[web01] Executing task 'alpha' 
[web03] Executing task 'beta' 
[web03] run: hostname 
[web03] out: web03 
[web03] out:
Subiendo el nivel 
Decorador execute 
[web04] Executing task 'beta' 
[web04] run: hostname 
[web04] out: web04 
[web04] out:
Subiendo el nivel 
Decorador execute 
[web02] Executing task 'alpha' 
[web03] Executing task 'beta' 
[web03] run: hostname 
[web03] out: web03 
[web03] out:
Subiendo el nivel 
Decorador execute 
[web04] Executing task 'beta' 
[web04] run: hostname 
[web04] out: web04 
[web04] out: 
Done.
Subiendo el nivel 
Separar en “módulos” 
directorio 
├── fabfile.py 
├── proyecto01.py 
└── proyecto02.py
Subiendo el nivel 
Separar en “módulos” 
fabfile.py 
from fabric.api import env 
import proyecto01 
import proyecto02 
env.use_ssh_config = True
Subiendo el nivel 
Separar en “módulos” 
proyecto01.py 
from fabric.api import execute, task 
@task 
def deploy(version): 
'''Deploy the specified version of stuff 
... 
'''
Subiendo el nivel 
Separar en “módulos” 
proyecto02.py 
from fabric.api import execute, task 
@task 
def shutdown(): 
'''Shutdowns machine'''
Subiendo el nivel 
Separar en “módulos” 
fab -l 
Available commands: 
proyecto01.deploy_stuff Deploy the 
specified version of stuff 
proyecto02.shutdown Shutdown machine 
fab proyect01.deploy_stuff:release_X.Y.Z
Subiendo el nivel (en la nube)
Subiendo el nivel (en la nube) 
Ejemplo usando boto 
from fabric.api import env, execute, run, 
task 
import boto.ec2 
REGION = 'eu-west-1' 
env.skip_bad_hosts = True 
env.use_ssh_config = True
Subiendo el nivel (en la nube) 
Ejemplo usando boto 
def get_hosts_list_by_role(role): 
conn = boto.ec2.connect_to_region(REGION) 
filters = { 
'instance-state-name': 'running', 
'tag:role': role, 
} 
return [instance.private_ip_address 
for instance in 
conn.get_only_instances(filters=filters)]
Subiendo el nivel (en la nube) 
Ejemplo usando boto 
def kick_it(what): 
run('restart {what}'.format(what=what)) 
@task 
def restart_faulty_workers(): 
worker_hosts = 
get_hosts_list_by_role(role='worker') 
if worker_hosts: 
execute(kick_it, hosts=worker_hosts, 
what='pehachepe')
Usar Fabric como biblioteca 
from fabric.api import env, run 
from fabric.network import disconnect_all 
def check_log(jobid): 
env.use_ssh_config = True 
env.host_string = 'hostname' 
try: 
run('LANG="C" grep -C 10 {jobid} 
log'.format(jobid=jobid)) 
finally: 
disconnect_all()
Usar Fabric como biblioteca 
from fabric.api import env, execute, run 
from fabric.network import disconnect_all 
def func(): 
env.use_ssh_config = True 
env.warn_only = True 
try: 
f = run('ls -lR /', pty=False, combine_stderr=False) 
print('Return code is: {}'.format(f.return_code)) 
print('STDERR has:') 
print(f.stderr) 
finally: 
disconnect_all()
Usar Fabric como biblioteca 
def run_stuff(): 
execute(func, host='hostname') 
def main(): 
run_stuff() 
if __name__ == '__main__': 
main()
¿Preguntas?
Un poco de viralidad
Gracias
Créditos 
http://upload.wikimedia.org/wikipedia/commons/c/c1/Basilica_del_Pilar-sunset. 
jpg 
http://upload.wikimedia.org/wikipedia/commons/4/4a/Python3- 
powered_hello-world.svg 
http://i.giphy.com/JtwZyPicr2vTi.gif 
http://www.mariowiki.com/images/thumb/6/68/SMB_W1- 
1_Glitch3.gif/180px-SMB_W1-1_Glitch3.gif 
http://static.ow.ly/photos/original/7uAzQ.png 
http://i.giphy.com/140ObFj9MRjRIc.gif 
http://i.giphy.com/dXICCcws9oxxK.gif 
http://i.giphy.com/1Z02vuppxP1Pa.gif

Más contenido relacionado

La actualidad más candente

Materiales del curso de Symfony2
Materiales del curso de Symfony2Materiales del curso de Symfony2
Materiales del curso de Symfony2Raul Fraile
 
Clase 2 conceptos fundamentales
Clase 2   conceptos fundamentalesClase 2   conceptos fundamentales
Clase 2 conceptos fundamentaleshydras_cs
 
File Transfer Protocol
File Transfer ProtocolFile Transfer Protocol
File Transfer ProtocolFrancesc Perez
 
Clase php I - Wampserver Configuration
Clase php I - Wampserver ConfigurationClase php I - Wampserver Configuration
Clase php I - Wampserver ConfigurationBit Clode
 
Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Raul Fraile
 
La maquina virtual_paralela_pvm
La maquina virtual_paralela_pvmLa maquina virtual_paralela_pvm
La maquina virtual_paralela_pvmingdianabaquero
 
Con Symlink Hasta la Cocina..
Con Symlink Hasta la Cocina.. Con Symlink Hasta la Cocina..
Con Symlink Hasta la Cocina.. Dylan Irzi
 
Dns maestro y esclavo(1)
Dns maestro y esclavo(1)Dns maestro y esclavo(1)
Dns maestro y esclavo(1)jessidi
 
Explotar Eternalblue & Doublepulsar para obener una shell de Empire/Meterpret...
Explotar Eternalblue & Doublepulsar para obener una shell de Empire/Meterpret...Explotar Eternalblue & Doublepulsar para obener una shell de Empire/Meterpret...
Explotar Eternalblue & Doublepulsar para obener una shell de Empire/Meterpret...Telefónica
 
Directorio vitual
Directorio vitualDirectorio vitual
Directorio vitualmomum
 
deSymfony 2013 - Creando aplicaciones web desde otro ángulo con Symfony y A...
deSymfony 2013 -  Creando aplicaciones web desde otro ángulo con Symfony y A...deSymfony 2013 -  Creando aplicaciones web desde otro ángulo con Symfony y A...
deSymfony 2013 - Creando aplicaciones web desde otro ángulo con Symfony y A...Pablo Godel
 
Cómo explotar EternalBlue en Windows Server 2012 R2
Cómo explotar EternalBlue en Windows Server 2012 R2Cómo explotar EternalBlue en Windows Server 2012 R2
Cómo explotar EternalBlue en Windows Server 2012 R2Telefónica
 
Estructura basica para_c_(2)
Estructura basica para_c_(2)Estructura basica para_c_(2)
Estructura basica para_c_(2)Maztherprozh
 
Cómo explotar EternalRomance & EternalSynergy en Windows Server 2016
Cómo explotar EternalRomance & EternalSynergy en Windows Server 2016Cómo explotar EternalRomance & EternalSynergy en Windows Server 2016
Cómo explotar EternalRomance & EternalSynergy en Windows Server 2016Telefónica
 

La actualidad más candente (18)

Materiales del curso de Symfony2
Materiales del curso de Symfony2Materiales del curso de Symfony2
Materiales del curso de Symfony2
 
Clase 2 conceptos fundamentales
Clase 2   conceptos fundamentalesClase 2   conceptos fundamentales
Clase 2 conceptos fundamentales
 
Java Rmi
Java RmiJava Rmi
Java Rmi
 
Comandos de red
Comandos de redComandos de red
Comandos de red
 
03practica puertosip
03practica puertosip03practica puertosip
03practica puertosip
 
File Transfer Protocol
File Transfer ProtocolFile Transfer Protocol
File Transfer Protocol
 
Clase php I - Wampserver Configuration
Clase php I - Wampserver ConfigurationClase php I - Wampserver Configuration
Clase php I - Wampserver Configuration
 
Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain
 
La maquina virtual_paralela_pvm
La maquina virtual_paralela_pvmLa maquina virtual_paralela_pvm
La maquina virtual_paralela_pvm
 
Con Symlink Hasta la Cocina..
Con Symlink Hasta la Cocina.. Con Symlink Hasta la Cocina..
Con Symlink Hasta la Cocina..
 
Dns maestro y esclavo(1)
Dns maestro y esclavo(1)Dns maestro y esclavo(1)
Dns maestro y esclavo(1)
 
Explotar Eternalblue & Doublepulsar para obener una shell de Empire/Meterpret...
Explotar Eternalblue & Doublepulsar para obener una shell de Empire/Meterpret...Explotar Eternalblue & Doublepulsar para obener una shell de Empire/Meterpret...
Explotar Eternalblue & Doublepulsar para obener una shell de Empire/Meterpret...
 
Directorio vitual
Directorio vitualDirectorio vitual
Directorio vitual
 
deSymfony 2013 - Creando aplicaciones web desde otro ángulo con Symfony y A...
deSymfony 2013 -  Creando aplicaciones web desde otro ángulo con Symfony y A...deSymfony 2013 -  Creando aplicaciones web desde otro ángulo con Symfony y A...
deSymfony 2013 - Creando aplicaciones web desde otro ángulo con Symfony y A...
 
RabbitMQ y Symfony
RabbitMQ y SymfonyRabbitMQ y Symfony
RabbitMQ y Symfony
 
Cómo explotar EternalBlue en Windows Server 2012 R2
Cómo explotar EternalBlue en Windows Server 2012 R2Cómo explotar EternalBlue en Windows Server 2012 R2
Cómo explotar EternalBlue en Windows Server 2012 R2
 
Estructura basica para_c_(2)
Estructura basica para_c_(2)Estructura basica para_c_(2)
Estructura basica para_c_(2)
 
Cómo explotar EternalRomance & EternalSynergy en Windows Server 2016
Cómo explotar EternalRomance & EternalSynergy en Windows Server 2016Cómo explotar EternalRomance & EternalSynergy en Windows Server 2016
Cómo explotar EternalRomance & EternalSynergy en Windows Server 2016
 

Similar a Fabric más allá de lo básico

Entornos de desarrollo para symfony2 con vagrant y puppet
Entornos de desarrollo para symfony2 con vagrant y puppetEntornos de desarrollo para symfony2 con vagrant y puppet
Entornos de desarrollo para symfony2 con vagrant y puppetVicent Soria Durá
 
Usando Docker con sistemas Asterisk
Usando Docker con sistemas AsteriskUsando Docker con sistemas Asterisk
Usando Docker con sistemas AsteriskVOIP2DAY
 
Usando Docker con sistemas Asterisk
Usando Docker con sistemas AsteriskUsando Docker con sistemas Asterisk
Usando Docker con sistemas AsteriskElio Rojano
 
FROM lost to the Docker 2020
FROM lost to the Docker 2020FROM lost to the Docker 2020
FROM lost to the Docker 2020BelnGonzlezGarca1
 
Cuckoo sandbox
Cuckoo sandboxCuckoo sandbox
Cuckoo sandboxTensor
 
WordPress, Nginx, Ghost y Telegram con Docker - I Meetup Docker Córdoba - Quaip
WordPress, Nginx, Ghost y Telegram con Docker - I Meetup Docker Córdoba - QuaipWordPress, Nginx, Ghost y Telegram con Docker - I Meetup Docker Córdoba - Quaip
WordPress, Nginx, Ghost y Telegram con Docker - I Meetup Docker Córdoba - Quaipquaip
 
La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
La Caja de Herramientas del Desarrollador Moderno PHPConferenceARLa Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
La Caja de Herramientas del Desarrollador Moderno PHPConferenceARPablo Godel
 
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosDesymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosJavier Eguiluz
 
Cuckoosandbox
CuckoosandboxCuckoosandbox
CuckoosandboxTensor
 
Cuckoo sandbox
Cuckoo sandboxCuckoo sandbox
Cuckoo sandboxTensor
 
PHPVigo #23 - Taller de Docker para PHP
PHPVigo #23 - Taller de Docker para PHPPHPVigo #23 - Taller de Docker para PHP
PHPVigo #23 - Taller de Docker para PHPRolando Caldas
 
Debian Lenny Asterisk
Debian Lenny AsteriskDebian Lenny Asterisk
Debian Lenny Asteriskmanzurek
 
Docker Ecosystem: Engine, Compose, Machine, Swarm, Registry
Docker Ecosystem: Engine, Compose, Machine, Swarm, RegistryDocker Ecosystem: Engine, Compose, Machine, Swarm, Registry
Docker Ecosystem: Engine, Compose, Machine, Swarm, RegistryMario IC
 
Vagrant y Docker - Guía práctica de uso
Vagrant y Docker - Guía práctica de usoVagrant y Docker - Guía práctica de uso
Vagrant y Docker - Guía práctica de usoSergio Zambrano Delfa
 
15 configuracion de firewall freddy beltran
 15 configuracion de firewall  freddy beltran 15 configuracion de firewall  freddy beltran
15 configuracion de firewall freddy beltranbeppo
 

Similar a Fabric más allá de lo básico (20)

FROM lost to the docker
FROM lost to the dockerFROM lost to the docker
FROM lost to the docker
 
Entornos de desarrollo para symfony2 con vagrant y puppet
Entornos de desarrollo para symfony2 con vagrant y puppetEntornos de desarrollo para symfony2 con vagrant y puppet
Entornos de desarrollo para symfony2 con vagrant y puppet
 
Usando Docker con sistemas Asterisk
Usando Docker con sistemas AsteriskUsando Docker con sistemas Asterisk
Usando Docker con sistemas Asterisk
 
Usando Docker con sistemas Asterisk
Usando Docker con sistemas AsteriskUsando Docker con sistemas Asterisk
Usando Docker con sistemas Asterisk
 
FROM lost to the Docker 2020
FROM lost to the Docker 2020FROM lost to the Docker 2020
FROM lost to the Docker 2020
 
Cuckoo sandbox
Cuckoo sandboxCuckoo sandbox
Cuckoo sandbox
 
Introduccion A Docker
Introduccion A DockerIntroduccion A Docker
Introduccion A Docker
 
WordPress, Nginx, Ghost y Telegram con Docker - I Meetup Docker Córdoba - Quaip
WordPress, Nginx, Ghost y Telegram con Docker - I Meetup Docker Córdoba - QuaipWordPress, Nginx, Ghost y Telegram con Docker - I Meetup Docker Córdoba - Quaip
WordPress, Nginx, Ghost y Telegram con Docker - I Meetup Docker Córdoba - Quaip
 
Primeros pasos con Docker
Primeros pasos con DockerPrimeros pasos con Docker
Primeros pasos con Docker
 
La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
La Caja de Herramientas del Desarrollador Moderno PHPConferenceARLa Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
 
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosDesymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
 
Cuckoosandbox
CuckoosandboxCuckoosandbox
Cuckoosandbox
 
PDIDTI-S7.pptx
PDIDTI-S7.pptxPDIDTI-S7.pptx
PDIDTI-S7.pptx
 
Cuckoo sandbox
Cuckoo sandboxCuckoo sandbox
Cuckoo sandbox
 
PHPVigo #23 - Taller de Docker para PHP
PHPVigo #23 - Taller de Docker para PHPPHPVigo #23 - Taller de Docker para PHP
PHPVigo #23 - Taller de Docker para PHP
 
Debian Lenny Asterisk
Debian Lenny AsteriskDebian Lenny Asterisk
Debian Lenny Asterisk
 
Docker Ecosystem: Engine, Compose, Machine, Swarm, Registry
Docker Ecosystem: Engine, Compose, Machine, Swarm, RegistryDocker Ecosystem: Engine, Compose, Machine, Swarm, Registry
Docker Ecosystem: Engine, Compose, Machine, Swarm, Registry
 
Vagrant y Docker - Guía práctica de uso
Vagrant y Docker - Guía práctica de usoVagrant y Docker - Guía práctica de uso
Vagrant y Docker - Guía práctica de uso
 
15 configuracion de firewall freddy beltran
 15 configuracion de firewall  freddy beltran 15 configuracion de firewall  freddy beltran
15 configuracion de firewall freddy beltran
 
docker.pdf
docker.pdfdocker.pdf
docker.pdf
 

Más de Alejandro E Brito Monedero (14)

Mad scalability (perfomance debugging)
Mad scalability (perfomance debugging)Mad scalability (perfomance debugging)
Mad scalability (perfomance debugging)
 
Tres historias
Tres historiasTres historias
Tres historias
 
AMQP vs GRAPHITE
AMQP vs GRAPHITEAMQP vs GRAPHITE
AMQP vs GRAPHITE
 
Sysdig
SysdigSysdig
Sysdig
 
Sysdig SRECon 16 Europe
Sysdig SRECon 16 EuropeSysdig SRECon 16 Europe
Sysdig SRECon 16 Europe
 
Funcional para trollear
Funcional para trollearFuncional para trollear
Funcional para trollear
 
Top Bug
Top BugTop Bug
Top Bug
 
Experiencias con PostgreSQL en AWS
Experiencias con PostgreSQL en AWSExperiencias con PostgreSQL en AWS
Experiencias con PostgreSQL en AWS
 
Fabric Fast & Furious edition
Fabric Fast & Furious editionFabric Fast & Furious edition
Fabric Fast & Furious edition
 
Así que pusiste MongoDB. Dime ¿cómo lo administras?
Así que pusiste MongoDB. Dime ¿cómo lo administras?Así que pusiste MongoDB. Dime ¿cómo lo administras?
Así que pusiste MongoDB. Dime ¿cómo lo administras?
 
AWS Baby steps circa 2008
AWS Baby steps circa 2008AWS Baby steps circa 2008
AWS Baby steps circa 2008
 
Using Logstash, elasticsearch & kibana
Using Logstash, elasticsearch & kibanaUsing Logstash, elasticsearch & kibana
Using Logstash, elasticsearch & kibana
 
Wireshark tips
Wireshark tipsWireshark tips
Wireshark tips
 
Mi experiencia con Amazon AWS EC2 y S3
Mi experiencia con Amazon AWS EC2 y S3Mi experiencia con Amazon AWS EC2 y S3
Mi experiencia con Amazon AWS EC2 y S3
 

Último

MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptxMacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptxcalzadillasluis134
 
Presentación de html, css y javascript.
Presentación  de html, css y javascript.Presentación  de html, css y javascript.
Presentación de html, css y javascript.CeteliInmaculada
 
Semana 5-Conceptualización del lenguaje de programación C++
Semana 5-Conceptualización del lenguaje de programación C++Semana 5-Conceptualización del lenguaje de programación C++
Semana 5-Conceptualización del lenguaje de programación C++luzgaray6
 
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVOSISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVOELIAMARYTOVARFLOREZD
 
Theme design in Plone 6 - World Plone Day 2024
Theme design in Plone 6 - World Plone Day 2024Theme design in Plone 6 - World Plone Day 2024
Theme design in Plone 6 - World Plone Day 2024Leonardo J. Caballero G.
 
Introducción a Plone CMS - World Plone Day 2024
Introducción a Plone CMS - World Plone Day 2024Introducción a Plone CMS - World Plone Day 2024
Introducción a Plone CMS - World Plone Day 2024Leonardo J. Caballero G.
 

Último (6)

MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptxMacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
MacOS SISTEMA OPERATIVO CARACTERISTICAS.pptx
 
Presentación de html, css y javascript.
Presentación  de html, css y javascript.Presentación  de html, css y javascript.
Presentación de html, css y javascript.
 
Semana 5-Conceptualización del lenguaje de programación C++
Semana 5-Conceptualización del lenguaje de programación C++Semana 5-Conceptualización del lenguaje de programación C++
Semana 5-Conceptualización del lenguaje de programación C++
 
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVOSISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
SISTEMA INTEGRADO DE ADMINISTRACION FINANCIERA - SIAF MODULO ADMINISTRATIVO
 
Theme design in Plone 6 - World Plone Day 2024
Theme design in Plone 6 - World Plone Day 2024Theme design in Plone 6 - World Plone Day 2024
Theme design in Plone 6 - World Plone Day 2024
 
Introducción a Plone CMS - World Plone Day 2024
Introducción a Plone CMS - World Plone Day 2024Introducción a Plone CMS - World Plone Day 2024
Introducción a Plone CMS - World Plone Day 2024
 

Fabric más allá de lo básico

  • 1. Fabric más allá de lo básico PyConES 2014 - Zaragoza Alejandro E. Brito Monedero - @ae_bm
  • 2. ¿Quién soy? Mi nombre debe salir en el programa Con “estudios” en Ciencias de la Computación Más de 8 años trabajando como sysadmin / devops / SRE / <poner etiqueta tonta aquí> Más info en http://bit.ly/1sT7bLw Dejar en la puerta todas las expectativas que tengas, por favor
  • 3. Checklist ¿Qué es Fabric? Primeros pasos Subiendo el nivel Usar Fabric como biblioteca (Gracias Andrey)
  • 4. ¿Qué es Fabric? Fabric es una biblioteca de Python (2.5-2.7) y herramienta de línea de comandos para facilitar el uso de SSH para el despliegue de aplicaciones o tareas de administración de sistemas. Ya sabes de forma pythonica La estructura de algo / Tela / Un club nocturno en Londres / Un proxy para toysql http://www.fabfile.org/en/latest/
  • 5. ¿Qué es Fabric? Y python3 ?
  • 6. ¿Qué es Fabric? ¡Calma! Se está cocinando Fabric 2 y bibliotecas como invoke http://www.fabfile.org/en/latest/roadmap.html #invoke-fabric-2-x-and-patchwork http://www.pyinvoke.org/ Todo esto está en desarrollo y como sabrán a los sysadmin se nos juzga por la estabilidad de los sistemas
  • 7. Primeros pasos Instalar pip install fabric Crear un fabfile.py from fabric.api import run def host_type(): run('uname -s')
  • 8. Primeros pasos Ejecutar fab -H host host_type [host] run: uname -s [host] out: Linux
  • 9. Primeros pasos Un poco más del API de Fabric local sudo settings cd env.hosts
  • 11. Subiendo el nivel Usando Fabric como Func / Mcollective / Ansible command fab -H web01,web02 -- "cd /var/www && pwd" [web01] Executing task '<remainder>' [web01] run: cd /var/www && pwd [web01] out: /var/www [web01] out:
  • 12. Subiendo el nivel Usando Fabric como Func / Mcollective / Ansible command [web02] Executing task '<remainder>' [web02] run: cd /var/www && pwd [web02] out: /var/www [web02] out: Done.
  • 13. Subiendo el nivel Usando el decorador task Antes from fabric.api import run def private(): run('pwd') def public(): # preparar cosas private()
  • 14. Subiendo el nivel Usando el decorador task Antes fab -l Available commands: private public
  • 15. Subiendo el nivel Usando el decorador task Después from fabric.api import run, task def private(): run('pwd') @task def public(): # preparar cosas private()
  • 16. Subiendo el nivel Usando el decorador task Después fab -l Available commands: public
  • 17. Subiendo el nivel Documentando las funciones from fabric.api import task @task def deploy_stuff(version): '''Deploy the specified version of stuff Keyword arguments: version -- version to deploy
  • 18. Subiendo el nivel Documentando las funciones Example: $ fab deploy:release_X.Y.Z '''
  • 19. Subiendo el nivel Documentando las funciones fab -l Available commands: deploy_stuff Deploy the specified version of stuff
  • 20. Subiendo el nivel Documentando las funciones fab -d deploy_stuff Displaying detailed information for task 'deploy_stuff': Deploy the specified version of stuff
  • 21. Subiendo el nivel Documentando las funciones Keyword arguments: version -- version to deploy Example: $ fab deploy:release_X.Y.Z
  • 22. Subiendo el nivel Decorador execute from fabric.api import cd, execute, sudo, task def update_code(version, code_path, user='root'): '''Update code''' ...
  • 23. Subiendo el nivel Decorador execute @task def deploy_stuff(version): '''Deploy the specified version of stuff ...
  • 24. Subiendo el nivel Decorador execute execute(update_code, hosts=['web01', 'web02'], version=version, user='root', code_path='path')
  • 25. Subiendo el nivel Decorador execute Para que execute funcione correctamente las tareas llamadas por execute no deben tener hosts asociados, sino al llamar la tarea se ejecutara múltiples veces, se puede evitar usando el decorador runs_once
  • 26. Subiendo el nivel Decorador execute ... env.use_ssh_config = True @task @hosts('web01', 'web02') def alpha(): execute(beta)
  • 27. Subiendo el nivel Decorador execute @hosts('web03', 'web04') def beta(): execute(gamma) def gamma(): run('hostname')
  • 28. Subiendo el nivel Decorador execute fab alpha [web01] Executing task 'alpha' [web03] Executing task 'beta' [web03] run: hostname [web03] out: web03 [web03] out:
  • 29. Subiendo el nivel Decorador execute [web04] Executing task 'beta' [web04] run: hostname [web04] out: web04 [web04] out:
  • 30. Subiendo el nivel Decorador execute [web02] Executing task 'alpha' [web03] Executing task 'beta' [web03] run: hostname [web03] out: web03 [web03] out:
  • 31. Subiendo el nivel Decorador execute [web04] Executing task 'beta' [web04] run: hostname [web04] out: web04 [web04] out: Done.
  • 32. Subiendo el nivel Separar en “módulos” directorio ├── fabfile.py ├── proyecto01.py └── proyecto02.py
  • 33. Subiendo el nivel Separar en “módulos” fabfile.py from fabric.api import env import proyecto01 import proyecto02 env.use_ssh_config = True
  • 34. Subiendo el nivel Separar en “módulos” proyecto01.py from fabric.api import execute, task @task def deploy(version): '''Deploy the specified version of stuff ... '''
  • 35. Subiendo el nivel Separar en “módulos” proyecto02.py from fabric.api import execute, task @task def shutdown(): '''Shutdowns machine'''
  • 36. Subiendo el nivel Separar en “módulos” fab -l Available commands: proyecto01.deploy_stuff Deploy the specified version of stuff proyecto02.shutdown Shutdown machine fab proyect01.deploy_stuff:release_X.Y.Z
  • 37. Subiendo el nivel (en la nube)
  • 38. Subiendo el nivel (en la nube) Ejemplo usando boto from fabric.api import env, execute, run, task import boto.ec2 REGION = 'eu-west-1' env.skip_bad_hosts = True env.use_ssh_config = True
  • 39. Subiendo el nivel (en la nube) Ejemplo usando boto def get_hosts_list_by_role(role): conn = boto.ec2.connect_to_region(REGION) filters = { 'instance-state-name': 'running', 'tag:role': role, } return [instance.private_ip_address for instance in conn.get_only_instances(filters=filters)]
  • 40. Subiendo el nivel (en la nube) Ejemplo usando boto def kick_it(what): run('restart {what}'.format(what=what)) @task def restart_faulty_workers(): worker_hosts = get_hosts_list_by_role(role='worker') if worker_hosts: execute(kick_it, hosts=worker_hosts, what='pehachepe')
  • 41. Usar Fabric como biblioteca from fabric.api import env, run from fabric.network import disconnect_all def check_log(jobid): env.use_ssh_config = True env.host_string = 'hostname' try: run('LANG="C" grep -C 10 {jobid} log'.format(jobid=jobid)) finally: disconnect_all()
  • 42. Usar Fabric como biblioteca from fabric.api import env, execute, run from fabric.network import disconnect_all def func(): env.use_ssh_config = True env.warn_only = True try: f = run('ls -lR /', pty=False, combine_stderr=False) print('Return code is: {}'.format(f.return_code)) print('STDERR has:') print(f.stderr) finally: disconnect_all()
  • 43. Usar Fabric como biblioteca def run_stuff(): execute(func, host='hostname') def main(): run_stuff() if __name__ == '__main__': main()
  • 45. Un poco de viralidad
  • 47. Créditos http://upload.wikimedia.org/wikipedia/commons/c/c1/Basilica_del_Pilar-sunset. jpg http://upload.wikimedia.org/wikipedia/commons/4/4a/Python3- powered_hello-world.svg http://i.giphy.com/JtwZyPicr2vTi.gif http://www.mariowiki.com/images/thumb/6/68/SMB_W1- 1_Glitch3.gif/180px-SMB_W1-1_Glitch3.gif http://static.ow.ly/photos/original/7uAzQ.png http://i.giphy.com/140ObFj9MRjRIc.gif http://i.giphy.com/dXICCcws9oxxK.gif http://i.giphy.com/1Z02vuppxP1Pa.gif