Как выполнить развертывание на одном конкретном сервере с помощью Capistrano
-
07-07-2019 - |
Вопрос
У меня есть производственная система, в которой есть несколько серверов, выполняющих несколько ролей.Я хотел бы протестировать новый сервер приложений, развернув его на этом конкретном сервере, без необходимости повторного развертывания на каждом рабочем сервере.Есть ли способ попросить Capistrano выполнить развертывание на конкретном сервере?В идеале я хотел бы иметь возможность запустить что-то вроде
cap SERVER=app2.example.com ROLE=app production deploy
если бы я просто хотел выполнить развертывание на app2.example.com.
Спасибо!
[обновить] Я попробовал решение, предложенное wulong, выполнив:
cap HOSTS=app2.server.hostname ROLE=app qa deploy
но капистрано, похоже, пытался выполнять задачи для других ролей на этом сервере в дополнение к задачам приложения.Может надо обновить версию шапки (у меня v2.2.0)?
Решение
В итоге я разместил вопрос в списке пользователей capistrano. здесь, и получил следующий ответ от Джеймиса (немного отредактированный мной для ясности):
Попробуйте переменную среды HOSTS:
cap HOSTS=app2.example.com production deploy
Обратите внимание, что при этом app2 будет рассматриваться как находящийся в каждой роли, а не только в какой бы роли он ни был объявлен.
Если вы хотите сделать регулярное развертывание, но только действовать на app2, и только так как app2 объявлен в файле рецепта, вы можете использовать HOSTFILTER переменная вместо:
cap HOSTFILTER=app2.example.com production deploy
[...]
Рассмотрим этот конкретный пример.Предположим ваш скрипт определяет три сервера: A, B и C.И он определяет задачу, "фу", , который (по умолчанию) хочет работать на 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,
независимо от параметра:roles к задаче.
Если ты это сделаешь 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, с другой стороны, просто фильтрует существующие хосты против данного списка, выбирая только те серверы, которые уже находятся в список задач сервера.
Другие советы
Из коробки должно работать следующее:
cap HOSTS=app2.example.com ROLE=app deploy
Если вы хотите выполнить развертывание на >1 сервере с той же ролью:
cap HOSTS=app2.example.com,app3.example.com,app4.example.com ROLE=app deploy
У меня аналогичная проблема, и я попробовал следующее.Оно работает:
cap production ROLES=web HOSTS=machine1 stats
У вас должна быть возможность сделать что-то подобное в Deploy.rb:
task :production do
if ENV['SERVER'] && ENV['ROLE']
role ENV['ROLE'], ENV['SERVER']
else
# your full config
end
end
Вы также можете указать параметр хостов на уровне задачи следующим образом:
task :ship_artifacts, :hosts => ENV['DEST_HOST'] do
end