1. ホーム
  2. python

[解決済み] Fabricがエラーになったときにタスクを継続させる方法

2023-02-17 07:15:59

質問

複数のリモートサーバーで実行するタスクを定義した場合、あるサーバーでタスクが実行され、エラーで終了すると、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.

どのように解決するのですか?

から ドキュメント :

... Fabric はデフォルトで "fail-fast" 動作パターンを採用しています: リモートプログラムがゼロ以外の戻り値を返したり、fabfile の Python コードが例外に遭遇するなど、何かがうまくいかない場合、実行は直ちに停止されます。

これは一般的に望ましい動作ですが、ルールには多くの例外があるため、Fabricはenv.warn_onlyというブール値の設定を提供しています。デフォルトはFalseで、エラー状態が発生した場合、プログラムは直ちに中止されます。しかし、失敗した時に env.warn_only が True に設定されていると、例えば settings コンテキストマネージャの場合、Fabric は警告メッセージを出しますが、実行は継続されます。

を使用することで、エラーが無視される場所を細かく制御できるようです。 settings コンテキスト・マネージャ のように、何かと便利です。

from fabric.api import settings

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