Quando eu defino uma tarefa para ser executada em vários servidores remotos, se a tarefa for executada no servidor um e sair com um erro, o Fabric irá parar e abortar a tarefa. Mas eu quero fazer o fabric ignorar o erro e executar a tarefa no próximo servidor. Como posso fazer isso?
Por exemplo:
$ 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
No Fabric 1.5, existe um ContextManager que torna isso mais fácil:
Atualização: eu reconfirmei que isso funciona em ipython usando o seguinte código.
fonte
with hide('everything'):
Você também pode definir a configuração warn_only de todo o script para ser verdadeira com
fonte
Você deve definir a
abort_exception
variável de ambiente e capturar a exceção.Por exemplo:
Você também pode configurá-lo em um bloco com. Veja a documentação aqui .
fonte
fabric.api.env
dentro do seuexcept
bloco?env.abort_exception=MyException
para que pudesse executar minha própria falha. Ele meio que "funciona" se eu usar uma função em vez de uma classe (satisfaz a solicitação de chamada paraabort_exception
), mas ainda estou trabalhando em alguns outros problemas com essa abordagem.fabric.api.env
é.No Fabric 1.3.2, pelo menos, você pode recuperar a exceção capturando a
SystemExit
exceção. Isso é útil se você tiver mais de um comando para executar em um lote (como uma implantação) e quiser limpar se um deles falhar.fonte
SystemExit
mensagem ou o código de para obter mais detalhes.SystemExit
, definaabort_exception
uma exceção diferente, para que você não pegue acidentalmente exceções que não têm nada a ver com o Fabric. Veja minha resposta para um exemplo: stackoverflow.com/a/27990242/901641No Fabric 2.x, você pode apenas usar a execução de invoke com o argumento warn = True . De qualquer forma, invoke é uma dependência do Fabric 2.x :
De dentro de uma tarefa:
fonte
No meu caso, no Fabric> = 1,4 essa resposta foi a correta.
Você pode pular hosts ruins adicionando este:
Ou passando a
--skip-bad-hosts
bandeira /fonte