2012-05-15 22 views
12

¿Existe alguna manera de modificar dinámicamente hosts entre múltiples tareas paralelas? Esto es lo que tengo hasta ahora.Hosts dinámicos y tareas paralelas con la biblioteca Fabric

def init_hosts(): 
    env.hosts = [host1,host2,host3,host4] 

@parallel 
def task_1(): 
    if condition is False: 
     env.hosts.remove(env.host) 

@parallel 
def task_2(): 
    run('uname -s') 

Obviamente me faltan algunos env paramenters, pero sólo quiero task_2 para ejecutarse en máquinas que cumplen la condición de task_1. Parece que la lista de hosts de task_2 se inicializa al inicio, porque se ejecuta en todos los hosts en la lista inicial env.hosts definida en init_hosts(). También probé modificando y construyendo dinámicamente roledefs, pero obtuve el mismo resultado.

Editar: Además, ¿hay alguna manera de configurar una cola de ejecución paralela de forma que múltiples tareas paralelas se ejecuten en paralelo en lugar de secuencialmente?

Editar: Me las arreglé para conseguir mi resultado final deseado haciendo que cada tarea de salida de retorno, y analizando la salida para construir una nueva lista de hosts para pasar a ejecutar():

def init_hosts(): 
    env.hosts = [host1,host2,host3,host4] 

@parallel 
def task_1(): 
    if condition is False: 
     return False 
    else: 
     return True 

@parallel 
def task_2(): 
    run('uname -s') 

def run_tests(): 
    results = execute(task_1) 
    successful_hosts = [k for k in results.iterkeys() if results[k]] 
    execute(test_2, hosts=successful_hosts) 

Esto funciona, pero es bruto por muchas razones. ¿Hay una mejor manera?

Respuesta

3

La ejecución en paralelo utiliza horquillas, y como tal no comparte (retrocede) los cambios de estado. Así que cambiar una variable env en una tarea que se ejecuta en paralelo, no afecta a ninguna otra instancia de esa tarea en ejecución, ni cambia nada establecido globalmente antes de que se llamara.

Si todo lo que task_1 está haciendo es un chequeo, ¿por qué no simplemente incorporar esta lógica en task_2?

Cuestiones relacionadas