60

私は、いくつかの役割でいくつかのサーバーを持っている本番環境のシステムを持っています。本番環境のすべてのサーバーに再デプロイすることなく、特定のサーバーにデプロイして新しいアプリサーバーをテストしたいと思います。Capistranoに特定のサーバーにデプロイするように依頼する方法はありますか?理想的には、次のようなものを実行できるようにしたいと思います

cap SERVER=app2.example.com ROLE=app production deploy

app2.example.comにデプロイしたいだけの場合。

ありがとう!

[更新]次を実行して、wulongによって提案された解決策を試しました。

cap HOSTS=app2.server.hostname ROLE=app qa deploy 

しかし、capistranoは、アプリタスクに加えて、そのサーバー上の他の役割のタスクを実行しようとしているように見えました。たぶん、capのバージョンを更新する必要があります(v2.2.0を実行しています)?

4

5 に答える 5

128

カピストラーノのユーザー リストに質問を投稿したところ、Jamis から次のような回答がありました (わかりやすくするために、ここで少し編集しました)。


HOSTS 環境変数を試してください。

cap HOSTS=app2.example.com production deploy

これを行うと、 app2 がたまたま宣言されたロールだけでなく、すべてのロールにあるものとして扱われることに注意してください。

通常のデプロイを行いたいが、app2 のみを操作し、app2 がレシピ ファイルで宣言されている場合のみ、HOSTFILTER 変数を代わりに使用できます。

cap HOSTFILTER=app2.example.com production deploy 

[...]

この具体例を考えてみましょう。スクリプトで、A、B、C の 3 つのサーバーを定義するとします。さらに、(デフォルトでは) A と B で実行するが、C では実行しないタスク "foo" を定義するとします。次のようにします。

role :app, "A", "B"
role :web, "C"

task :foo, :roles => :app do
  run "echo hello"
end

すると、cap fooA と B の両方で echo コマンドが実行されます。

実行cap HOSTS=C fooすると、タスクへの :roles パラメータに関係なく、C で echo コマンドが実行されます。

cap HOSTFILTER=C fooすると、(AB) と (C) の交点が空のセットになるため、echo コマンドはまったく実行されません。(foo のホスト リストには、C に一致するホストはありません。)

cap HOSTFILTER=A fooすると、(A) と交差する (AB) は (A) であるため、A でのみ echo コマンドが実行されます。

最後に、cap HOSTFILTER=A,B,C foo(AB) は (ABC) と交差しているので、(AB) は (AB) であるため、A と B (C ではなく) に対して echo コマンドを実行します。

要約すると、HOSTS は、タスクのホストまたはロールの宣言を完全にオーバーライドし、指定されたホストに対してすべての実行を強制します。一方、HOSTFILTER は、指定されたリストに対して既存のホストを単純にフィルタリングし、既にタスク サーバー リストにあるサーバーのみを選択します。

于 2009-01-22T19:59:02.817 に答える
3

以下は、箱から出してすぐに動作するはずです。

cap HOSTS=app2.example.com ROLE=app deploy

同じロールを持つ複数のサーバーにデプロイする場合:

cap HOSTS=app2.example.com,app3.example.com,app4.example.com ROLE=app deploy
于 2009-01-11T00:49:46.633 に答える
2

同様の問題があり、次のことを試しました。できます:

cap production ROLES=web HOSTS=machine1 stats
于 2011-01-24T02:00:02.043 に答える
1

deploy.rbで次のようなことができるはずです。

task :production do
  if ENV['SERVER'] && ENV['ROLE']
    role ENV['ROLE'], ENV['SERVER']
  else
    # your full config
  end
end
于 2009-01-10T02:27:34.877 に答える
0

次の方法で、タスク レベルのホスト パラメータを指定することもできます。

task :ship_artifacts, :hosts => ENV['DEST_HOST']  do

end 
于 2015-03-11T07:53:37.883 に答える