2016-07-06 5 views
1

私は最近Capistrano 2からCapistrano 3に切り替わりました。多くの変更がありました。新しいCapistranoをプロジェクトでCapistrano 2を使って修正しようとしています。私は取り組んでいます。Capistrano 3役割に固有のタスク

私が今直面している最大の問題は、役割によるフィルタリングです。

ROLES=web,worker cap production deploy 

しかし、すべての役割を持つ単一のサーバーを使用している場合は、実際には何もしないようです。

カピストラーノ2で、私は実行することができます:

cap worker deploy 

、すべての労働者のタスクが適用されます。 Capistrano 2はタスクに指定された役割を持ち、役割が要求されなかった場合、タスクはスキップされました(ほとんどの場合)。しかし、Capistrano 3の場合はそうではないようですが、フィルターは各役割ごとに特定のサーバーを持つマルチサーバー環境で優れています。しかし、サーバーが役割を共有している場合や、単一のサーバーがある場合は、それはちょっと変わってしまいます。新しいCapistranoのタスクでは、タスクが実行されるべきかどうか、または役割に基づいていないかどうかを確認するのではなく、特定の役割を持つホストがあるかどうかをチェックするようです。 ROLESはタスクではなくサーバーを制限することを意図しているようです。

私はこれがCapistrano 3で可能かどうか疑問に思います。これを表示する別の方法は、名前でタスクをグループ化することです。実行するタスクのグループを選択したいと思います。

私はいくつかの工夫でこれを達成することができ、私は動的ロールに基づいてタスクを添付することができ、私は役割に応じてロードするためにレシピかを選択でき、それに基づいてタスクかどうかを役割が存在するかどうかを確認し、スキップ可能性がありvarを使用したり、ロールという名前のファイルでタスクをグループ化したり、ROLESなどに応じてその動的ローディングを実行したりすることができます。

どのような考えですか?

答えて

0

ROLESはタスクではなくサーバーを制限することを意図しているようです。

はい、そうです。 Capistrano 3では、タスクは役割とは何の関係もありません。タスク内では、特定の役割に一致するサーバー上でコマンドを実行できます。 ROLESを使用してフィルタリングする場合、コマンドが実行されるサーバーを制限しますが、タスク自体は制限しません。

タスクを制限できる方法の1つは、必要なタスクを呼び出す独自の高水準タスクを定義することです。例えば

# In deploy.rb 
task "worker" do 
    invoke "task1" 
    invoke "task2" 
    # etc. 
end 

これは、順番に、あなたが好きなことができるタスクの特定のリストを実行workerタスクを定義します。

cap production worker 

プロダクションサーバーでこれらのすべてのワーカー関連タスクが実行されます。

関連する問題