2011-03-17 10 views
30

Tengo un fabfile como la siguiente:¿Puede una tarea de Python Fabric invocar otras tareas y respetar sus listas de hosts?

@hosts('host1') 
def host1_deploy(): 
    """Some logic that is specific to deploying to host1""" 

@hosts('host2') 
def host2_deploy(): 
    """Some logic that is specific to deploying to host2""" 

def deploy(): 
    """"Deploy to both hosts, each using its own logic""" 
    host1_deploy() 
    host2_deploy() 

me gustaría hacer

fab deploy 

y tiene que ser equivalente a

fab host1_deploy host2_deploy 

En otras palabras, ejecutar cada una de las subtareas y para cada una use la lista de hosts que especifica. Sin embargo, esto no funciona. En cambio, la tarea deploy() desea su propia lista de hosts que propagará a todas sus subtareas.

¿Hay alguna forma de actualizar la tarea deploy() aquí para que haga lo que quiero mientras dejo las subtareas para que puedan ejecutarse individualmente?

Respuesta

1

Probablemente hay una mejor manera de manejar la situación, pero que podrían pasar dos anfitriones para desplegar(), y luego en host1_deploy() y host2_deploy() consultar env.host:

def host1_deploy(): 
    if env.host in ['host1']: 
     run(whatever1) 

def host2_deploy(): 
    if env.host in ['host2']: 
     run(whatever2) 

@hosts('host1','host2') 
def deploy(): 
    host1_deploy() 
    host2_deploy() 
1

prueba este. Obviamente, desea reemplazar local con run o sudo. La clave es el vacío @hosts decorador de deploy

from fabric.api import local 
from fabric.decorators import hosts 

@hosts('host1') 
def host1_deploy(): 
    """Some logic that is specific to deploying to host1""" 
    local('echo foo') 

@hosts('host2') 
def host2_deploy(): 
    """Some logic that is specific to deploying to host2""" 
    local('echo bar') 

@hosts('') 
def deploy(): 
    """"Deploy to both hosts, each using its own logic""" 
    host1_deploy() 
    host2_deploy() 
+0

No funciona ... –

3

Ésta es escaso, pero funciona a partir de Tela 1.1.2

def host1_deploy(): 
    """Some logic that is specific to deploying to host1""" 
    if env.host in ["host1"]: 
     pass #this is only on host2 

def host2_deploy(): 
    """Some logic that is specific to deploying to host2""" 
    if env.host in ["host2"]: 
     pass #this is only on host2 

def deploy(): 
    """"Deploy to both hosts, each using its own logic""" 
    host1_deploy() 
    host2_deploy() 

aquí es mi código de prueba:

@task 
@roles(["prod_web","prod_workers"]) 
def test_multi(): 
    test_multi_a() 
    test_multi_b() 

def test_multi_a(): 
    if env.host in env.roledefs["prod_web"]: 
     run('uname -a') 

def test_multi_b(): 
    if env.host in env.roledefs["prod_workers"]: 
     run('uname -a') 
30

Desde Tela 1.3 , el asistente execute ahora está disponible para hacer esto. La documentación está disponible aquí: Intelligently executing tasks with execute.

Aquí es el ejemplo que utilizan:

from fabric.api import run, roles 

env.roledefs = { 
    'db': ['db1', 'db2'], 
    'web': ['web1', 'web2', 'web3'], 
} 

@roles('db') 
def migrate(): 
    # Database stuff here. 
    pass 

@roles('web') 
def update(): 
    # Code updates here. 
    pass 

Y luego ejecutar tanto migrate y web de otra tarea deploy:

def deploy(): 
    execute(migrate) 
    execute(update) 

y esto va a respetar las funciones y anfitriones listas que esas tareas tener.

+0

¿Es posible agregar el rol a un método de clase? Uso las clases para las tareas de tejido –

+1

El enlace a la documentación está roto. Aquí está lo último: http://docs.fabfile.org/en/1.8/usage/execution.html#intelligently-executing-tasks-with-execute – krd

Cuestiones relacionadas