2012-02-05 74 views
3

给予以下fabfile:有没有办法在结构文件中进行滚动部署?

from fabric.api import env, run 

env.user = 'implicit_user' 
env.hosts = ['host1', '[email protected]', 'host3'] 

def print_user(): 
    with hide('running'): 
     run('echo "%(user)s"' % env) 

当我们运行fab print_user,我们得到:

[host1] out: implicit_user 
[[email protected]] out: explicit_user 
[host3] out: implicit_user 

Done. 
Disconnecting from host1... done. 
Disconnecting from host2... done. 
Disconnecting from host3... done. 

但是,我非常要进行整个fab print_user顺序,以10秒的间隔在这两者之间做出确保先前的主机在下一个主机将动作关闭之前完成其操作:

[host1] out: implicit_user 
<10 seconds here...> 
[[email protected]] out: explicit_user 
<10 seconds here...> 
[host3] out: implicit_user 
<10 seconds here...> 

Done. 
Disconnecting from host1... done. 
Disconnecting from host2... done. 
Disconnecting from host3... done. 

有没有办法做到这一点?我应该如何调整我的fabfile来实现它?

回答

5

除非您通过命令行指定并行,否则您的文件已经按顺序执行。要明确这个顺序执行,请使用@serial decorator

您是否希望延迟处理失败? warn_only=False将导致您的一个顺序任务失败以终止任务(其他主机不会运行任务)。这也在下面的例子中看到,只要运行false(它具有失败退出状态),剩下的主机就不会运行任务。

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") 

如果你真的想这个10秒钟的延迟我想你可以作出这样的休眠10一个装饰或者在你的任务结束正好眠。

+1

谢谢。这太棒了;)我正在尝试。 – 2012-02-09 05:28:51

相关问题