在fabric文件中如何进行滚动部署?

3 投票
1 回答
2135 浏览
提问于 2025-04-17 12:22

给出以下的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 个回答

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

如果你真的想要这个10秒的延迟,我想你可以做一个装饰器,让它睡眠10秒,或者在你的任务结束时直接让它睡眠。

撰写回答