Cuando defino una tarea para que se ejecute en varios servidores remotos, si la tarea se ejecuta en el servidor uno y sale con un error, Fabric detendrá y abortará la tarea. Pero quiero hacer que la tela ignore el error y ejecute la tarea en el siguiente servidor. ¿Cómo puedo hacer que haga esto?
Por ejemplo:
$ 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.
from fabric.api settings
A partir de Fabric 1.5, existe un ContextManager que facilita esto:
Actualización: volví a confirmar que esto funciona en ipython usando el siguiente código.
fuente
with hide('everything'):
También puede establecer la configuración warn_only del script completo para que sea verdadera con
fuente
Debe establecer la
abort_exception
variable de entorno y detectar la excepción.Por ejemplo:
También puede configurarlo en un bloque with. Consulte la documentación aquí .
fuente
fabric.api.env
dentro de tuexcept
cuadra?env.abort_exception=MyException
para poder ejecutar mi propio error. En cierto modo, "funciona" si uso una función en lugar de una clase (satisface la solicitud deabort_exception
) pero todavía estoy trabajando en algunos otros problemas con ese enfoque.fabric.api.env
es.En Fabric 1.3.2 al menos, puede recuperar la excepción detectando la
SystemExit
excepción. Eso es útil si tiene más de un comando para ejecutar en un lote (como una implementación) y desea limpiar si uno de ellos falla.fuente
SystemExit
mensaje o código de para obtener más detalles.SystemExit
, establecerabort_exception
una excepción diferente, para que no detecte accidentalmente excepciones que no tienen nada que ver con Fabric. Vea mi respuesta para ver un ejemplo: stackoverflow.com/a/27990242/901641En Fabric 2.x puedes usar invocación 's carrera con la verdadera advertir = argumento. De todos modos, invoke es una dependencia de Fabric 2.x :
Desde dentro de una tarea:
fuente
En mi caso, en Fabric> = 1.4 esta respuesta fue la correcta.
Puede omitir hosts defectuosos agregando esto:
O pasar la
--skip-bad-hosts
bandera /fuente