Как продолжить задачу, когда 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. 

  • Как git совершить ничего без ошибки?
  • пароль ткани
  • Как установить рабочий каталог для задачи Fabric?
  • Передача параметра в задание на ткань
  • ImportError: Нет модуля с именем «pip._vendor.distlib.scripts», когда я пытаюсь установить структуру с помощью python pip
  • Получить текущее значение списка env.hosts с помощью библиотеки Fabric Fabric
  • Использование ключевого файла SSH с помощью Fabric
  • Использование Python Fabric без инструмента командной строки (fab)
  • 6 Solutions collect form web for “Как продолжить задачу, когда Fabric получает сообщение об ошибке”

    Из документов :

    … Ткань по умолчанию имеет «неуправляемый» шаблон поведения: если что-то пойдет не так, например, удаленная программа, возвращающая ненулевое возвращаемое значение, или код Python файла fabfile, столкнувшись с исключением, выполнение немедленно прекратится.

    Обычно это желаемое поведение, но существует множество исключений из правила, поэтому Fabric предоставляет env.warn_only, логическую настройку. По умолчанию используется значение False, что означает, что условие ошибки приведет к немедленному прерыванию программы. Однако, если для параметра env.warn_only установлено значение True в момент сбоя – например, с помощью диспетчера контекстов настроек – Fabric выдаст предупреждающее сообщение, но продолжит выполнение.

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

    Вы также можете установить для параметра true_only всего сценария значение true

     def local(): env.warn_only = True 

    Вы должны установить abort_exception среды 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 исключение SystemExit . Это полезно, если у вас есть несколько команд для запуска в пакетной версии (например, для развертывания) и вы хотите очистить, если один из них не работает.

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

    Вы можете пропустить неудачные хосты, добавив следующее:

     env.skip_bad_hosts = True 

    Или передав --skip-bad-hosts /

    Python - лучший язык программирования в мире.