一般的な質問/解答(FAQ)

これらは私たちがユーザーから受け取ったいくつかの最も一般的な問題または一般的な問題だ。これらは残りの文書を読む代わりに使われているわけではありませんので、質問がここで回答されていない場合は、必ずチェックしてください。

注釈

多くのAPI例およびリンクは、バージョン2およびより高いバージョンのためのものであり、バージョン1に固有の一般的な問題は、一般にこのようにマークされる。

私の (cd ``workon///export/など)呼び出しが効かないようだ!

Fabricはシェルスクリプトのような多くのタスクに利用可能ですが、それぞれ直感的ではない問題があります。 run あるいは…。 sudo コール(または run/sudo V 1)中の関数は独自のシェルセッションを持つ.これは,Fabricが命令実行後にその標準出力/エラーと帰還コードを確実に決定するために必要である.

不幸にも、これは次のようなコードの行動があなたの仮定とは異なることを意味します。

@task
def deploy(c):
    c.run("cd /path/to/application")
    c.run("./update.sh")

これがシェルスクリプトなら2つ目は run 呼び出しは、現在のワークディレクトリで /path/to/application/ --しかし、この2つのコマンドはSSHを介してそれぞれ異なるセッションで実行されるため、実際に実行しようとします。 $HOME/update.sh 逆に(リモートホームディレクトリはデフォルトのワークディレクトリですので)。

1つの簡単な解決方法は、ハウジング論理を用いて動作することであり、例えば && これは,複数の表現をリンクしており(左側の実行に誤りがなければ),以下のようになる.

def deploy(c):
    c.run("cd /path/to/application && ./update.sh")

注釈

絶対パスを使用して、ディレクトリ変更を完全にスキップすることもできます:

def deploy(c):
    c.run("/path/to/application/update.sh")

しかし、これは問題のあるコマンドを要求して、あなたの現在の作業リストを仮定することはできません!

どうして私は時々見ます err: stdin: is not a tty そうなの?

Invoke's FAQ そのため,呼び出しに基づいていないFabric v 1に対しても,答えは同じである.

なぜ私は楽屋で動作できないのですか & そうなの?これは生地を掛けることができます。

Because SSH executes a new shell session on the remote end for each invocation of run or sudo (see also), backgrounded processes may prevent the calling shell from exiting until the processes stop running, which in turn prevents Fabric from continuing on with its own execution.

この問題を解決する鍵は、あなたのプロセスのすべての標準パイプが呼び出しシェルから分離されていることを確実にすることであり、これは様々な方法で実現することができます(壮健な順序で列挙されています)。

  • 手元のプログラムにデーモン技術が存在する場合は,サーババイナリファイルを直接呼び出すのではなく,あらかじめ存在するデーモンプロセス技術であるたとえば,initスクリプトを呼び出してください.

    • Or leverage a process manager such as supervisord, upstart or systemd - such tools let you define what it means to "run" one of your background processes, then issue init-script-like start/stop/restart/status commands. They offer many advantages over classic init scripts as well.

  • Use tmux, screen or dtach to fully detach the process from the running shell; these tools have the benefit of allowing you to reattach to the process later on if needed (though they are more ad-hoc than supervisord-like tools).

  • プログラムを下で実行する nohup または同様の“シェル内”ツール--この方法は、多くのユーザの成功に限定されていることに留意されたい。

時々私はパスワードではなくパスワードの入力を間違って要求される。

我々のSSH層には何らかの誤りがあるため,Fabricが必要な認証タイプをつねに正確に検出することは不可能である.我々が要求されているのは秘密鍵暗号か遠隔サーバ暗号かを推測することを試みなければならず,場合によっては我々の推測は最終的に誤りである.

最も一般的な場合は、あなた(ローカルユーザ)はSSH鍵チェーンエージェントを実行しているようですが、リモートサーバは、公開鍵を送信していない、または誤ったユーザ名を使用しているなど、SSH鍵をサポートできません。この場合、Fabricは“秘密鍵のための暗号フレーズを入力してください”と提示しますが、入力されたテキストは実際に遠隔端末の暗号認証に送信されます。

将来のバージョンでは前述のSSHライブラリに貢献することでこの問題を解決したい.