【问题标题】:Is there a way to conduct rolling deployment in fabric files?有没有办法在结构文件中进行滚动部署?
【发布时间】:2012-02-05 10:19:03
【问题描述】:

给出以下 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 来实现它?

【问题讨论】:

    标签: python deployment fabric


    【解决方案1】:

    除非您通过命令行指定并行,否则您的文件已经按顺序执行。要明确说明这种顺序执行,请使用 @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 秒的装饰器,或者只是在任务结束时休眠。

    【讨论】:

    • 谢谢。这太棒了;)我正在尝试。
    猜你喜欢
    • 2022-07-29
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多