当前位置: 首页 > 面试题库 >

Fabric收到错误时如何继续执行任务

申黎明
2023-03-14
问题内容

当我定义一个任务在多个远程服务器上运行时,如果该任务在一个服务器上运行并退出并出现错误,Fabric将停止并中止该任务。但我想让Fabric忽略该错误并在下一台服务器上运行该任务。我怎样才能做到这一点?

例如:

$ fab site1_service_gw
[site1rpt1] Executing task 'site1_service_gw'

[site1fep1] run: echo 'Nm123!@#' | sudo -S route
[site1fep1] err:
[site1fep1] err: We trust you have received the usual lecture from the local System
[site1fep1] err: Administrator. It usually boils down to these three things:
[site1fep1] err:
[site1fep1] err:     #1) Respect the privacy of others.
[site1fep1] err:     #2) Think before you type.
[site1fep1] err:     #3) With great power comes great responsibility.
[site1fep1] err: root's password:
[site1fep1] err: sudo: route: command not found

Fatal error: run() encountered an error (return code 1) while executing 'echo 'Nm123!@#' | sudo -S route '

Aborting.

问题答案:

从文档:


Fabric默认为“快速失败”行为模式:如果发生任何错误,例如远程程序返回非零返回值或fabfile的Python代码遇到异常,则执行将立即停止。

这通常是所需的行为,但是该规则有很多例外,因此Fabric提供了布尔设置env.warn_only。默认为False,这意味着错误情况将导致程序立即中止。但是,如果在发生故障时将env.warn_only设置为True(例如使用设置上下文管理器),则Fabric将发出警告消息,但会继续执行。

看起来您可以使用settings上下文管理器对忽略错误的位置进行细粒度控制,如下所示:

from fabric.api import settings

sudo('mkdir tmp') # can't fail
with settings(warn_only=True):
    sudo('touch tmp/test') # can fail
sudo('rm tmp') # can't fail


 类似资料:
  • null 理想情况下,我想恢复执行失败的任务,有库存和所有事实收集以前的任务。有可能吗?如何让playbook编写/调试更快?

  • 问题内容: 我正在通过Java与Eclipse和TestNG框架一起使用Selenium RC。我有以下代码片段: 第一个断言失败,执行被停止。但我想继续进一步的代码片段。 问题答案: Selenium IDE使用验证执行软断言,这意味着即使检查失败,测试仍将继续,并且可以在测试结束时或在发生硬断言时报告失败。 使用TestNG,可以通过使用自定义测试侦听器来拥有这些软断言。我已经在博客上记录了如

  • 我制作了一个程序,要求用户输入5位数字,然后程序将查找这些数字的总和。我想知道我怎样才能使程序在计算一次之后一遍又一遍地要求一个数字。我希望用户再试一次,直到他自己想退出。

  • 我是RxJava的新手。我有一个,用于下载图像URL列表并将其转换为位图的简单网络操作。 在活动的上,我取消订阅可观察到的以避免内存泄漏。 我能看到的是,如果我在图像下载过程中退出活动,后台任务也会被终止。我只想继续做背景工作,即使我已经取消了《观察家》的订阅。有可能吗?

  • 我已经创建了3个任务。Task3取决于Task1和Task2的结果。在调试代码时,它会正确执行,但在运行应用程序时,Task3会在Task1和Task2完成之前执行。 示例代码: 提前谢谢。

  • 我一直在寻找这样一种情况的解决方案:我有一个调用项的哈希集,并且我要将这个集提交给执行器进行并行执行。现在我想只要任何提交的任务完成,我应该能够分配一个新的Callable到Executor。 我尝试了这段代码,但是如果我使用Executor.Invoke,那么Executor将等待直到所有任务完成,如果我使用Executor.Submit,那么任务将按顺序完成。如有任何帮助,我们将不胜感激。