Capistranoを使用して単一の特定のサーバーに展開する方法
-
07-07-2019 - |
質問
複数の役割を持つ複数のサーバーを備えたシステムを運用しています。運用中のすべてのサーバーに再展開することなく、その特定のサーバーに展開することにより、新しいアプリサーバーをテストしたいと思います。 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ユーザーリストに質問を投稿しましたこちら 、およびJamisから次の応答を受け取りました(わかりやすくするために、ここで少し編集しました):
HOSTS環境変数を試してください:
cap HOSTS=app2.example.com production deploy
これを行うと、app2がすべての役割にあるものとして扱われるだけでなく、 どちらのロールでも、たまたま宣言されています。
通常のデプロイを行いたいが、app2のみを実行する場合 app2がレシピファイルで宣言されている場合のみ、HOSTFILTERを使用できます 代わりに変数:
cap HOSTFILTER=app2.example.com production deploy
[...]
この具体例を検討してください。あなたの スクリプトは、A、B、Cの3つのサーバーを定義します。そして、タスク「foo」を定義します。 (デフォルトで)AとBで実行したいが、Cでは実行したくない。このように:
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
を実行すると、Cでechoコマンドが実行され、
タスクの:rolesパラメーターに関係なく。
cap HOSTFILTER = C foo
を実行すると、次の場所でechoコマンドが実行されません。
これは、(A B)と(C)の交差が空のセットだからです。 (そこ
Cに一致するfooのホストリストにホストがありません。)
cap HOSTFILTER = A foo
を実行すると、echoコマンドが実行されるのは
A(A)と交差する(A B)は(A)であるため。
最後に、 cap HOSTFILTER = A、B、C foo
を実行すると、エコーが実行されます
(A B)が(A B C)と交差しているため、AおよびB(ただしCではない)のコマンド
は(A B)です。
要約すると、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