カピストラーノのユーザー リストに質問を投稿したところ、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 foo
A と 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 は、指定されたリストに対して既存のホストを単純にフィルタリングし、既にタスク サーバー リストにあるサーバーのみを選択します。