Lorsque je définis une tâche à exécuter sur plusieurs serveurs distants, si la tâche s'exécute sur le serveur un et se termine avec une erreur, Fabric s'arrêtera et abandonnera la tâche. Mais je veux que Fabric ignore l'erreur et exécute la tâche sur le serveur suivant. Comment puis-je faire cela?
Par exemple:
$ 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
À partir de Fabric 1.5, il existe un ContextManager qui facilite les choses:
Mise à jour: j'ai reconfirmé que cela fonctionne dans ipython en utilisant le code suivant.
la source
with hide('everything'):
Vous pouvez également définir le paramètre warn_only du script entier sur true avec
la source
Vous devez définir la
abort_exception
variable d'environnement et intercepter l'exception.Par exemple:
Vous pouvez également le définir dans un bloc with. Consultez la documentation ici .
la source
fabric.api.env
dans votreexcept
bloc?env.abort_exception=MyException
pour que je puisse exécuter mon propre échec. Cela fonctionne en quelque sorte si j'utilise une fonction au lieu d'une classe (satisfait la demande appelable pourabort_exception
) mais je travaille toujours sur d'autres problèmes avec cette approche.fabric.api.env
c'est.Dans Fabric 1.3.2 au moins, vous pouvez récupérer l'exception en interceptant l'
SystemExit
exception. Cela est utile si vous avez plus d'une commande à exécuter dans un lot (comme un déploiement) et que vous souhaitez nettoyer si l'une d'entre elles échoue.la source
SystemExit
message ou le code du s pour plus de détails.SystemExit
, définieabort_exception
sur une exception différente, afin de ne pas intercepter accidentellement des exceptions qui n'ont rien à voir avec Fabric. Voir ma réponse pour un exemple: stackoverflow.com/a/27990242/901641Dans Fabric 2.x, vous pouvez simplement utiliser l' exécution de invoke avec l' argument warn = True . Quoi qu'il en soit, invoke est une dépendance de Fabric 2.x :
À partir d'une tâche:
la source
Dans mon cas, sur Fabric> = 1.4 cette réponse était la bonne.
Vous pouvez ignorer les mauvais hôtes en ajoutant ceci:
Ou passer le
--skip-bad-hosts
drapeau /la source