【问题标题】:How do I abort a set of fabric tasks running in parallel on multiple hosts, if one of those tasks fails?如果其中一个任务失败,我如何中止在多个主机上并行运行的一组结构任务?
【发布时间】:2020-09-10 21:33:23
【问题描述】:

目前,我可以使用带有@runs_once 的顶级任务快速部署到多个主机,该任务执行带有@parallel 修饰的任务,该任务拾取角色中定义的所有主机。

我可以运行部署任务:

fab -R production deploy:myApp.tgz

目前,如果其中一项任务失败,会发生以下情况:

[host2] Executing task 'deploy'
[host1] Executing task '_deploy'
[host2] deploy failed on host 2
[host3] Executing task '_deploy'
[host1] deployed b69488da3e on host 1 
[host3] deployed b69488da3e on host 3 
Fatal error: deploy failed on host 2

Aborting.

如您所见,在所有并行任务完成之前,结构会话不会中止。如果我要在生产环境中运行它,即使第一个主机出现故障,它也可以轻松关闭所有主机。

理想情况下,我想在任务失败后立即中止会话。但是this is not possible。我已经尝试过织物功能abort('failed task')local("exit 1") 以及更传统的sys.exit(1)os._exit(1)。我能够停止正在运行的并行任务结构会话的唯一方法是键盘中断。

因此,我想首先对单个主机运行,如果失败则中止,而不是继续部署到所有主机。这将使我能够获得并行执行相对于串行执行的大部分速度优势(检查应用程序是否恢复需要大量等待),同时防止愉快地破坏所有 prod 主机的灾难情况。类似于“金丝雀”模式的东西。我无法在运行时通过将列表传递给 execute() 或使用设置上下文来修改主机列表。

使用: 蟒蛇2 面料 1.14.1 帕拉米科 2.6.0

【问题讨论】:

    标签: python fabric


    【解决方案1】:

    您可以通过以下方式实现此金丝雀模式:

    def _one_off_generator(fn, one_off=True):
        if one_off:
            @runs_once                                                                                                                      
            def once(*args):
                return fn(*args)
            return once
        else:
            @parallel                                                                                                                       
            def many(*args):                                                                                                                
                return fn(*args)
            return many
    
    @task
    @runs_once
    def deploy(fn):
        
        canary_deploy = _one_off_generator(_deploy)
    
        execute(canary_deploy, fn)
    
        parallel_deploy = _one_off_generator(_deploy, one_off=False)
        prev = execute(parallel_deploy, fn)
    @task
    def _deploy(fn):
        #deploy things
    
    

    【讨论】:

      猜你喜欢
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      • 2015-12-14
      • 2019-06-25
      • 1970-01-01
      • 2011-05-31
      相关资源
      最近更新 更多