How to continue a task when Fabric receives an error How to continue a task when Fabric receives an error python python

How to continue a task when Fabric receives an error


From the docs:

... Fabric defaults to a “fail-fast” behavior pattern: if anything goes wrong, such as a remote program returning a nonzero return value or your fabfile’s Python code encountering an exception, execution will halt immediately.

This is typically the desired behavior, but there are many exceptions to the rule, so Fabric provides env.warn_only, a Boolean setting. It defaults to False, meaning an error condition will result in the program aborting immediately. However, if env.warn_only is set to True at the time of failure – with, say, the settings context manager – Fabric will emit a warning message but continue executing.

Looks like you can exercise fine-grained control over where errors are ignored by using the settings context manager, something like so:

from fabric.api import settingssudo('mkdir tmp') # can't failwith settings(warn_only=True):    sudo('touch tmp/test') # can failsudo('rm tmp') # can't fail


As of Fabric 1.5, there is a ContextManager that makes this easier:

from fabric.api import sudo, warn_onlywith warn_only():    sudo('mkdir foo')

Update: I re-confirmed that this works in ipython using the following code.

from fabric.api import local, warn_only#aborted with SystemExit after 'bad command'local('bad command'); local('bad command 2')#executes both commands, printing errors for eachwith warn_only():    local('bad command'); local('bad command 2')


You can also set the entire script's warn_only setting to be true with

def local():    env.warn_only = True