web-dev-qa-db-ja.com

Capistranoを使用して単一の特定のサーバーに展開する方法

私は、いくつかの役割のいくつかのサーバーを備えたシステムを運用しています。運用中のすべてのサーバーに再展開することなく、その特定のサーバーに展開することにより、新しいアプリサーバーをテストしたいと思います。 Capistranoに特定のサーバーへの展開を依頼する方法はありますか?理想的には、次のようなものを実行できるようにしたい

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

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

ありがとう!

[更新] wulongが提案するソリューションを実行してみました:

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

しかし、capistranoは、アプリのタスクに加えて、そのサーバー上の他のロールのタスクを実行しようとしているようです。キャップのバージョンを更新する必要があるかもしれません(v2.2.0を実行しています)?

56
Pete Hodgson

私はcapistranoユーザーリストに質問を投稿することになりました here 、そしてJamisから次の応答を得ました(明確にするためにここで少し編集しました):


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

cap HOSTS=app2.example.com production deploy

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

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

cap HOSTFILTER=app2.example.com production deploy 

[...]

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

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

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

ここで、cap foo、AとBの両方でechoコマンドを実行します。

もしあなたがそうするなら cap HOSTS=C foo、タスクの:rolesパラメーターに関係なく、Cでechoコマンドを実行します。

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

もしあなたがそうするなら cap HOSTFILTER=A foo、(A)と交差する(A B)は(A)であるため、Aでのみechoコマンドを実行します。

最後に、_cap HOSTFILTER=A,B,C foo、(A B)と交差する(A B C)は(A B)であるため、AおよびB(ただしCではない)でechoコマンドを実行します。

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

124
Pete Hodgson

以下は、そのまま使用できます。

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

同じ役割を持つ1台以上のサーバーにデプロイする場合:

cap HOSTS=app2.example.com,app3.example.com,app4.example.com ROLE=app deploy
3
wulong

私は同様の問題を抱えており、以下を試しました。できます:

cap production ROLES=web HOSTS=machine1 stats
2
Xian Xu

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

task :production do
  if ENV['SERVER'] && ENV['ROLE']
    role ENV['ROLE'], ENV['SERVER']
  else
    # your full config
  end
end
1
Dave Pirotte

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

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

end 
0
jeffreyveon