Ich habe eine Frage an die Capistrano-Benutzerliste hier gepostet und folgende Antwort von Jamis (hier etwas bearbeitet für Klarheit) erhalten:
Probieren Sie die HOSTS-Umgebungsvariable aus:
cap HOSTS=app2.example.com production deploy
Beachten Sie, dass dadurch app2 als Teil jeder Rolle behandelt wird, nicht nur in den Rolle(n), in denen es deklariert ist.
Wenn Sie einfach ein reguläres Deployment durchführen möchten, aber nur mit app2 arbeiten und nur so, wie es in Ihrer Rezeptdatei deklariert ist, können Sie stattdessen die HOSTFILTER-Variable verwenden:
cap HOSTFILTER=app2.example.com production deploy
[...]
Betrachten Sie dieses konkrete Beispiel. Angenommen Ihr Skript definiert drei Server: A, B und C. Und es definiert eine Aufgabe "foo", die (standardmäßig) auf A und B, aber nicht auf C, ausgeführt werden soll. So ähnlich:
role :app, "A", "B"
role :web, "C"
task :foo, :roles => :app do
run "echo hello"
Wenn Sie jetzt cap foo
ausführen, wird der echo-Befehl auf sowohl A als auch B ausgeführt.
Wenn Sie cap HOSTS=C foo
ausführen, wird der echo-Befehl auf C ausgeführt, unabhängig von den :roles-Parametern der Aufgabe.
Wenn Sie cap HOSTFILTER=C foo
ausführen, wird der echo-Befehl gar nicht ausgeführt, da der Schnitt von (A B) und (C) eine leere Menge ist. (Es gibt keine Hosts in der Hostliste von foo, die mit C übereinstimmen.)
Wenn Sie cap HOSTFILTER=A foo
ausführen, wird der echo-Befehl nur auf A ausgeführt, da (A B) geschnitten mit (A) (A) ergibt.
Zu guter Letzt, wenn Sie cap HOSTFILTER=A,B,C foo
ausführen, wird der echo-Befehl auf A und B (aber nicht C) ausgeführt, da (A B) geschnitten mit (A B C) (A B) ergibt.
Zusammenfassend: HOSTS überdeckt vollständig die Hosts- oder Rollendeklaration der Aufgabe und zwingt alles, gegen den angegebenen Host(s) ausgeführt zu werden. Der HOSTFILTER filtert hingegen einfach die vorhandenen Hosts gegen die gegebene Liste, indem nur die Server ausgewählt werden, die bereits in der Hostliste der Aufgaben enthalten sind.