Я закончил тем, что разместил вопрос в списке пользователей capistrano здесь и получил следующий ответ от Jamis (немного отредактированный мной здесь для ясности):
Попробуйте переменную среды HOSTS:
cap HOSTS=app2.example.com production deploy
Обратите внимание, что при этом app2 будет рассматриваться как роль в каждой роли, а не только
в какой бы роли (ролях) она ни была объявлена.
Если вы хотите сделать обычное развертывание, но действовать только на app2, и
только когда app2 объявлен в вашем файле рецепта, вы можете использовать HOSTFILTER
вместо переменной:
cap HOSTFILTER=app2.example.com production deploy
[...]
Рассмотрим этот конкретный пример. Предположим, ваш
Сценарий определяет три сервера, A, B и C. И он определяет задачу, "Foo",
который (по умолчанию) хочет работать на A и B, но не на C. Как это:
role :app, "A", "B"
role :web, "C"
task :foo, :roles => :app do
run "echo hello"
end
Теперь, если вы сделаете cap foo
, он запустит команду echo на A и B.
Если вы сделаете cap HOSTS=C foo
, он запустит команду echo на C,
независимо от параметра: role задачи.
Если вы сделаете cap HOSTFILTER=C foo
, он не будет запускать команду echo в
все, потому что пересечение (A B) и (C) является пустым множеством. (Там
нет хостов в списке хостов foo, соответствующих C.)
Если вы сделаете cap HOSTFILTER=A foo
, он будет запускать только команду echo
A, потому что (A B) пересекается с (A) есть (A).
Наконец, если вы сделаете cap HOSTFILTER=A,B,C foo
, он запустит эхо
команда на A и B (но не на C), потому что (A B) пересекается с (A B C)
есть (A B).
Подведем итог: HOSTS полностью переопределяет объявление хостов или ролей.
задачи, и заставляет все работать против указанных хостов.
HOSTFILTER, с другой стороны, просто фильтрует существующие хосты
против данного списка, выбирая только те серверы, которые уже находятся в
список серверов задач.