94 votes

Comment poursuivre une tâche lorsque le tissu reçoit une erreur

Lorsque je définis une tâche à exécuter sur plusieurs serveurs distants, si la tâche est exécutée sur le serveur numéro un et se termine avec une erreur, Fabric arrêtera et abandonnera la tâche. Mais je veux que la structure ignore l'erreur et exécute la tâche sur le prochain serveur. Comment puis-je le faire 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.
 

147voto

Will McCutchen Points 8193

À partir de la documentation:

... Tissu par défaut un "fail-fast" modèle de comportement: si quelque chose va mal, comme un programme à distance renvoyer une valeur de retour non nulle ou votre fabfile du code Python de la rencontre d'une exception, l'exécution de s'arrêter immédiatement.

C'est typiquement le comportement souhaité, mais il y a de nombreuses exceptions à la règle, le Tissu, env.warn_only, un paramètre Booléen. La valeur par défaut est False, ce qui signifie une condition d'erreur entraînera dans le programme de l'abandon immédiatement. Toutefois, si env.warn_only est définie à True au moment de la rupture – avec, par exemple, les paramètres du gestionnaire de contexte – Tissu émet un message d'avertissement mais poursuivre l'exécution.

Ressemble, vous pouvez exercer un contrôle précis sur l'endroit où les erreurs sont ignorées par l'aide de la settings gestionnaire de contexte, quelque chose comme ça:

sudo('mkdir tmp') # can't fail
with settings(warn_only=True):
    sudo('touch tmp/test') # can fail
sudo('rm tmp') # can't fail

31voto

Chris Marinos Points 385

Depuis Fabric 1.5, il existe un ContextManager qui facilite cela:

 from fabric.api import sudo, warn_only

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

Mise à jour: j'ai confirmé à nouveau que cela fonctionnait sous ipython à l'aide du code suivant.

 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')
 

13voto

Rawkcy Points 111

Vous pouvez également définir le paramètre warn_only du script entier sur true avec

 def local():
    env.warn_only = True
 

7voto

zimbatm Points 192

Dans Fabric 1.3.2 au moins, vous pouvez récupérer l'exception en interceptant l'exception SystemExit . Cela est utile si vous avez plusieurs commandes à exécuter dans un lot (comme un déploiement) et souhaitez nettoyer si l'une d'entre elles échoue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X