¿Hay una manera de llevar a cabo la implementación rodante en archivos de tejido?

Dando el siguiente archivo fab:

from fabric.api import env, run env.user = 'implicit_user' env.hosts = ['host1', 'explicit_user@host2', 'host3'] def print_user(): with hide('running'): run('echo "%(user)s"' % env) 

Cuando ejecutamos fab print_user , obtenemos:

 [host1] out: implicit_user [explicit_user@host2] out: explicit_user [host3] out: implicit_user Done. Disconnecting from host1... done. Disconnecting from host2... done. Disconnecting from host3... done. 

Sin embargo, me gustaría mucho llevar a cabo la totalidad de fab print_user secuencialmente, con un intervalo de 10 segundos en el medio para asegurarse de que el host anterior haya terminado con sus acciones antes de que el siguiente host inicie las acciones:

 [host1] out: implicit_user  [explicit_user@host2] out: explicit_user  [host3] out: implicit_user  Done. Disconnecting from host1... done. Disconnecting from host2... done. Disconnecting from host3... done. 

¿Hay una manera de hacerlo? ¿Cómo debo ajustar mi archivo fab para lograrlo?

Su archivo ya se ejecuta de forma secuencial a menos que esté especificando paralelo a través de la línea de comandos. Para ser explícito acerca de esta ejecución secuencial, use el decorador @serial .

¿Quieres que este retraso resuelva un fallo? warn_only=False causará un error en una de sus tareas secuenciales para terminar la tarea (otros hosts no ejecutarán la tarea). Esto también se ve en el ejemplo a continuación donde, tan pronto como se ejecuta false (tiene un estado de salida de error), el host restante no ejecuta la tarea.

 from fabric.api import * from fabric.decorators import hosts, parallel, serial import random @task @serial @with_settings(warn_only=False) def maybe_fail(): if random.randint(0,3) == 0: run("/bin/false") else: run("/bin/true") 

Si realmente quieres este retraso de 10 segundos, creo que podrías hacer un decorador que duerma durante 10 o simplemente al final de tus tareas.