Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果其中一个任务失败,如何中止在多台主机上并行运行的一组结构任务?_Python_Fabric - Fatal编程技术网

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):
#部署东西