如果其中一个任务失败,如何在多个主机上并行中止一组结构任务 运行?
How do I abort a set of fabric tasks running in parallel on multiple hosts, if one of those tasks fails?
目前,我可以使用带有 @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。我尝试了 fabric 函数 abort('failed task')
和 local("exit 1")
以及更传统的 sys.exit(1)
、os._exit(1)
。我能够停止并行任务的 运行ning 结构会话的唯一方法是键盘中断。
因此,我想首先 运行 针对单个主机进行操作,如果失败则中止,而不是继续部署到所有主机。这将使我能够获得并行执行相对于串行执行的大部分速度优势(检查应用程序是否恢复需要大量等待),同时防止愉快地破坏所有生产主机的灾难场景。有点像“金丝雀”模式。我无法在 运行 时通过将列表传递给 execute() 或使用设置上下文来修改主机列表。
使用:
Python 2
面料 1.14.1
帕拉米科 2.6.0
您可以通过以下方式实现此金丝雀模式:
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
目前,我可以使用带有 @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。我尝试了 fabric 函数 abort('failed task')
和 local("exit 1")
以及更传统的 sys.exit(1)
、os._exit(1)
。我能够停止并行任务的 运行ning 结构会话的唯一方法是键盘中断。
因此,我想首先 运行 针对单个主机进行操作,如果失败则中止,而不是继续部署到所有主机。这将使我能够获得并行执行相对于串行执行的大部分速度优势(检查应用程序是否恢复需要大量等待),同时防止愉快地破坏所有生产主机的灾难场景。有点像“金丝雀”模式。我无法在 运行 时通过将列表传递给 execute() 或使用设置上下文来修改主机列表。
使用: Python 2 面料 1.14.1 帕拉米科 2.6.0
您可以通过以下方式实现此金丝雀模式:
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