Как продолжить задачу, когда ткань получает сообщение об ошибке


когда я определяю задачу для запуска на нескольких удаленных серверах, если задача выполняется на одном сервере и завершается с ошибкой, 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.
7 89

7 ответов:

С документы:

... По умолчанию Fabric использует шаблон поведения "fail-fast": если что-то пойдет не так, например удаленная программа, возвращающая ненулевое возвращаемое значение, или код Python вашего fabfile, столкнувшийся с исключением, выполнение немедленно остановится.

обычно это желаемое поведение, но есть много исключений из правила, поэтому Fabric предоставляет env.warn_only, логическое задание. По умолчанию он имеет значение False, что означает ошибку состояние приведет к немедленному прерыванию программы. Однако, если ОКР.warn_only имеет значение True в момент сбоя – с, скажем, настройки context manager-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

начиная с Fabric 1.5, есть ContextManager, который упрощает это:

from fabric.api import sudo, warn_only

with warn_only():
    sudo('mkdir foo')

обновление: я повторно подтвердил, что это работает в ipython, используя следующий код.

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 each
with warn_only():
    local('bad command'); local('bad command 2')

вы также можете установить параметр warn_only всего скрипта, чтобы быть true с

def local():
    env.warn_only = True

вы должны установить abort_exception переменные среды и поймать исключение.

например:

from fabric.api        import env
from fabric.operations import sudo

class FabricException(Exception):
    pass

env.abort_exception = FabricException
# ... set up the rest of the environment...

try:
    sudo('reboot')
except FabricException:
    pass  # This is expected, we can continue.

вы также можете установить его в блок. Смотрите документацию здесь.

в Fabric 1.3.2 по крайней мере, вы можете восстановить исключение, поймав SystemExit исключения. Это полезно, если у вас есть несколько команд для запуска в пакете (например, развертывание) и вы хотите очистить, если один из них не удается.

на ткани 2.x вы можете просто использовать вызов ' s run С warn=True

в моем случае, на ткани >= 1.4 ответ был правильным.

вы можете пропустить плохие хосты, добавив Это:

env.skip_bad_hosts = True

и проходя мимо --skip-bad-hosts флаг/