在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 个回答
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秒,或者在你的任务结束时直接让它睡眠。