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

Win*_*hen 3 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)
Run Code Online (Sandbox Code Playgroud)

当我们跑步时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.
Run Code Online (Sandbox Code Playgroud)

但是,我非常希望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. 
Run Code Online (Sandbox Code Playgroud)

有办法吗?我应该如何调整我的fabfile来实现它?

Dan*_*cci 5

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

你想要这个延迟来处理失败吗?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")
Run Code Online (Sandbox Code Playgroud)

如果你真的想要这10秒的延迟,我想你可以让一个装饰者睡10个小时或者只是在任务结束时睡觉.