有没有办法在结构文件中进行滚动部署?

时间:2012-02-05 10:19:04

标签: python deployment fabric

提供以下fabfile:

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)

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

[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.

但是,我非常想按顺序执行整个fab print_user,间隔10秒,以确保在下一个主机关闭操作之前,前一个主机已完成其操作:

[host1] out: implicit_user
<10 seconds here...>
[explicit_user@host2] 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来实现它?

1 个答案:

答案 0 :(得分: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个小时,或者只是在任务结束时睡觉。