abort_on_promptsとwarn_only = Trueの両方を使用しようとすると、abort_on_promptsがwarn_onlyをオーバーライドし、ファブリックは引き続きSystemExitをスローします。
In [6]: from fabric.api import sudo, execute, cd, env, run, local
In [7]: with settings(warn_only = True):
result = local("ls -ltrh")
...:
[localhost] local: ls -ltrh
total 188K
In [8]: with settings(warn_only = True):
result = local("ls -ltrh /tmp/tartratrat")
...:
[localhost] local: ls -ltrh /tmp/tartratrat
ls: cannot access /tmp/tartratrat: No such file or directory
Warning: local() encountered an error (return code 2) while executing 'ls -ltrh /tmp/tartratrat'
In [9]: env['abort_on_prompts'] = True
In [10]: with settings(warn_only = True):
result = local("ls -ltrh /tmp/tartratrat")
....:
[localhost] local: ls -ltrh /tmp/tartratrat
ls: cannot access /tmp/tartratrat: No such file or directory
Warning: local() encountered an error (return code 2) while executing 'ls -ltrh /tmp/tartratrat'
In [11]: with settings(warn_only = True):
result = run("ls -ltrh /tmp/tartratrat")
....:
Fatal error: Needed to prompt for the target host connection string, but abort-on-prompts was set to True
Aborting.
An exception has occurred, use %tb to see the full traceback.
SystemExit: 1
To exit: use 'exit', 'quit', or Ctrl-D.
(ヒント、テキストフィールドの上にある[Github Flavoured Markdown]リンクを使用すると、正しくフォーマットする方法が表示されます。説明を修正しました:))
ほとんどの場合、ユーザーがabort_on_prompts
切り替えると、警告と続行ではなく、現在の動作(中止)を_おそらく_期待していると私は主張します。 warn_only=True
は通常、_リモートプログラム_に障害が発生した場合の対処方法と、Fabric自体の中止に適用されます。
ただし、両方がTrueであるこの状況は、十分に定義/文書化されていないことを認めます。 さらに、コードベースでのabort()
他のほとんどの使用は、「abort if warn_only=False
」ロジックを処理するerror()
への呼び出しに置き換えられました。
一貫性は、ユーザーがプロンプトで中止しようとし、予期しないwarn_only=True
によって妨害される可能性よりも優先され、要求している変更を行うことを今のところ呼びかけます。 他の人が不平を言ってきたら、私はあなたを前に出します;)
振り返ってみると、私はこれに本当に引き裂かれています。 前述のように、予期しないプロンプトでFabricを爆破させたいユーザーにとって、変更が台無しになっていることがわかります。 隠れたエラーは、追跡するのに非常にイライラする可能性があります。
@ pkittenis-これがあなたにとって問題となる現実の状況に直面していますか? try/except SystemExit
を使用して回避できますか?
これによってハードブロックされている場合は、新しい構成オプション(おそらくwarn_trumps_abort
ようなダム名)を追加して、予期しない変更を発生させることなく、ユースケースの人々が動作を制御できるようにすることをお勧めします。現在のユーザー向け。
問題は、 abort_on_prompts
の動作により、コマンドにエラーが発生したときにNo hosts found. Please specify (single) host string for connection:
にフォールバックすると、ファブリックがSystemExitをスローすることです。
ファブリックをAPIとして使用する場合、それはIMOが間違っています。 APIのユーザーは、実行時にSystemExitを回避し、代わりにコード内の戻りコードを処理できるように、すでにwarn_only
を設定しています。 それは素晴らしいことです。
次に、ユーザーセットabort_on_prompts
との代わりに、それが失敗したとき、彼のコマンドのエラーコードを取得するには、彼らがためにフォールバックのSystemExitをを取得enter a host
との使用abort_on_prompts
。 確かに例外を処理できますが、その場合、失敗したコマンドのリターンコードは表示されなくなります。
今のところ、 abort_on_prompts
をFalseにリセットすることで回避できますが、失敗する場合と失敗しない場合があるすべてのコマンドで実行する必要があります。
ファブリックをAPIとして使用する場合、コマンドラインで使用することを目的とした組み込みのファブリックプロンプト、特にNo hosts found..
を完全に無効にするフラグが最適だと思います。 その場合、 abort_on_prompts
は、それを引き起こすプロンプトがないため、SystemExitを引き起こしません。
+ 1-私は今まさにこの問題に直面しています。 私の具体的な使用例は、最近プロビジョニングされたクラウドノードをチェックし、それらのノードが適切な公開鍵でSSHアクセスできるかどうかを確認するためにFabricを使用していることです。 その結果、実際にabort_on_prompts例外を_キャッチ_する必要があります。 今のところ、SystemExitを明示的にキャッチするつもりですが、これは確かに非常に間違っていると感じています。
+ 1-abort_on_prompts例外もキャッチしたいと思います。
:+1:私はSystemExit
を上げたくないのと同じ状況にあります-それは私のセロリ労働者を殺します。
この段階では、このレベルの変更は、最初にAPIユースケースを使用し、セカンダリ/ラッパーのユースケースとしてCLIユースケースを使用して設計されているバージョン2.0に適していると感じています。 1.xで動作を変更すると、驚くべき/混乱する/バグを追加する可能性が高くなります。
2.xとしてタグ付けし、開いたままにしておくと、APIのその部分を作成するときに、もう一度確認して検討できるようになります。
+1- abort_on_prompts
とwarn_only
両方が_True_の場合、 warn_only
が優先されます。
この問題に関する別のスレッド、 @ reeesgaによる: https :
+1
+ 1-abort_on_promptsとwarn_onlyの両方がTrueの場合、warn_onlyが優先されます。 これを行うための新しい設定も問題ありません
これに関する更新はありますか?
SystemExitをキャッチしましたが、出力が見苦しくなります...
自分で見てください:
webapps2adm001.qa.aws.company.com:ルートSUCCESSとしての接続。
webapps2001.qa.aws.company.com:ルートSUCCESSとしての接続。致命的なエラー:接続またはsudoパスワード(ホスト:webapps3001.ia.aws.company.com)の入力を求める必要がありますが、パラレルモードでは入力があいまいになります
中絶。
webapps3001.ia.aws.company.com:ルートとしての接続に失敗しました。 SystemExit:1
webapps3adm001.ia.aws.company.com:ルートSUCCESSとしての接続。
中絶した後もラインを維持したいだけです。 エラーメッセージを見たくありません。
私もこの問題に直面しており、現在の動作が変更されるのを楽しみにしています。