私は、いくつかの役割のいくつかのサーバーを備えたシステムを運用しています。運用中のすべてのサーバーに再展開することなく、その特定のサーバーに展開することにより、新しいアプリサーバーをテストしたいと思います。 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を実行しています)?
私は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は、指定されたリストに対して既存のホストを単にフィルターし、タスクサーバーリストに既に存在するサーバーのみを選択します。
以下は、そのまま使用できます。
cap HOSTS=app2.example.com ROLE=app deploy
同じ役割を持つ1台以上のサーバーにデプロイする場合:
cap HOSTS=app2.example.com,app3.example.com,app4.example.com ROLE=app deploy
私は同様の問題を抱えており、以下を試しました。できます:
cap production ROLES=web HOSTS=machine1 stats
Deploy.rbで次のようなことができるはずです。
task :production do
if ENV['SERVER'] && ENV['ROLE']
role ENV['ROLE'], ENV['SERVER']
else
# your full config
end
end
この方法でタスクレベルのホストパラメータを指定することもできます。
task :ship_artifacts, :hosts => ENV['DEST_Host'] do
end