Ответ 1
В итоге я опубликовал вопрос о списке пользователей capistrano здесь, и получил следующий ответ от Jamis (отредактированный мной мною здесь для ясность):
Попробуйте переменную среды HOSTS:
cap HOSTS=app2.example.com production deploy
Обратите внимание, что это будет относиться к app2 как к каждой роли, а не только к какая бы роль (и) она не была объявлена.
Если вы хотите сделать регулярное развертывание, но только действовать на app2, и только когда app2 объявлен в вашем файле рецепта, вы можете использовать HOSTFILTER вместо этого:
cap HOSTFILTER=app2.example.com production deploy
[...]
Рассмотрим этот конкретный пример. Предположим, script определяет три сервера, 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
, он будет запускать команду эха для 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, с другой стороны, просто фильтрует существующие хосты против данного списка, выбирая только те серверы, которые уже находятся в список серверов задач.