Python 如果其中一个任务失败,如何中止在多台主机上并行运行的一组结构任务?
目前,我可以使用带有Python 如果其中一个任务失败,如何中止在多台主机上并行运行的一组结构任务?,python,fabric,Python,Fabric,目前,我可以使用带有@runs\u once的顶级任务快速部署到多个主机,该任务执行以@parallel修饰的任务,该任务将拾取角色中定义的所有主机 我可以运行部署任务: fab-R生产部署:myApp.tgz 目前,如果其中一项任务失败,会发生以下情况: [host2]正在执行任务“部署” [host1]正在执行任务“\u deploy” [host2]在主机2上部署失败 [host3]正在执行任务“\u deploy” [host1]在主机1上部署了b69488da3e [host3]在主
@runs\u once
的顶级任务快速部署到多个主机,该任务执行以@parallel
修饰的任务,该任务将拾取角色中定义的所有主机
我可以运行部署任务:
fab-R生产部署:myApp.tgz
目前,如果其中一项任务失败,会发生以下情况:
[host2]正在执行任务“部署”
[host1]正在执行任务“\u deploy”
[host2]在主机2上部署失败
[host3]正在执行任务“\u deploy”
[host1]在主机1上部署了b69488da3e
[host3]在主机3上部署了b69488da3e
致命错误:在主机2上部署失败
流产。
如您所见,在所有并行任务完成之前,结构会话不会中止。如果我在生产环境中运行这个程序,即使第一个主机出现故障,它也可以轻松地关闭所有主机
理想情况下,我希望在任务失败时立即中止会话。然而。我尝试过结构函数abort('failed task')
和local(“exit 1”)
以及更传统的sys.exit(1)
,os.\u exit(1)
。我能够停止并行任务的运行结构会话的唯一方法是键盘中断
因此,我希望首先在单个主机上运行,如果失败则中止,而不是继续部署到所有主机。这将使我获得并行执行相对于串行执行的大部分速度优势(检查应用程序是否恢复需要大量等待),同时防止轻松中断所有prod主机的灾难场景。有点像“金丝雀”图案。我无法通过传入要执行的列表()或使用设置上下文在运行时修改主机列表
使用:
Python 2
织物1.14.1
Paramiko 2.6.0您可以通过以下方式实现此金丝雀模式:
def\u一次关闭发生器(fn,一次关闭=真):
如果关闭一个(u):
@跑一次
def once(*args):
返回fn(*args)
返回一次
其他:
@平行的
def many(*args):
返回fn(*args)
回报很多
@任务
@跑一次
def部署(fn):
金丝雀部署=\u一次性\u生成器(\u部署)
执行(金丝雀部署,fn)
并行部署=\u一次部署\u生成器(\u部署,一次部署=False)
prev=执行(并行部署,fn)
@任务
def_部署(fn):
#部署东西