Как продолжить задачу, когда ткань получает сообщение об ошибке
когда я определяю задачу для запуска на нескольких удаленных серверах, если задача выполняется на одном сервере и завершается с ошибкой, 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 ответов:
С документы:
... По умолчанию 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
исключения. Это полезно, если у вас есть несколько команд для запуска в пакете (например, развертывание) и вы хотите очистить, если один из них не удается.
в моем случае, на ткани >= 1.4 ответ был правильным.
вы можете пропустить плохие хосты, добавив Это:
env.skip_bad_hosts = True
и проходя мимо
--skip-bad-hosts
флаг/