Как вы определяете одни и те же задачи по-разному для разных ролей в Capistrano?
Я использую Capistrano для обработки моего развертывания, и у меня есть две разные роли в моей настройке -: web и: обработка. Оба они имеют обычные задачи: развертывание, но задача перезапуска должна быть разной для двух типов серверов.
Итак, моя первая попытка была примерно такой:
task :restart, :roles => :web do
run "... web related restart stuff ..."
end
task :restart, :roles => :processing do
run "... processing related restart stuff ..."
end
Что не работает, потому что второе: restart (для: роль обработки) заменяет первое: restart (для: веб-роли) и: web: restart никогда не происходит.
Я быстро осмотрелся, чтобы увидеть, могу ли я писать условный код в зависимости от того, какая роль (или роли) может быть у сервера при выполнении задачи, но рядом с отсутствием документации для такого рода вещей. Любые идеи?
Ответы
Ответ 1
Вы должны использовать пространства имен:
namespace :web do
desc "Restart web servers"
task :restart, :roles => :web do
# Restart Magic Here
end
end
namespace :process do
desc "Restart process servers"
task :restart, :roles => :process do
# Restart magic here
end
end
# Optionally:
task :restart do
web.restart
process.restart
end
То, что вы ищете, я думаю!
Кроме того, чтобы использовать их в командной строке, вы должны использовать
$ cap <stage> # (if using multistage)
$ cap web:restart # Restarts web servers
$ cap process:restart # Restarts process servers
$ cap restart # Restarts both process and web servers
(Источник: я сопровождающий Капистрано.)
Ответ 2
В этом случае вы должны использовать "parallel" вместо "run":
task :restart do
parallel do |session|
session.when "in?(:web)", "...substitute run command contents here...."
session.when "in?(:process)", "...substitute run command contents here...."
end
end
Если вы собираетесь использовать что-либо, кроме "запуска" в разных задачах, вам лучше придерживаться одного из других ответов.
Дополнительную информацию о команде "parallel" можно найти здесь: https://github.com/capistrano/capistrano/wiki/2.x-DSL-Action-Invokation-Parallel
Ответ 3
Если вам нужно вызвать задание по умолчанию deploy
, а также выполнить произвольный перезапуск и т.д. Я придумал это решение:
# Servers
server "importerhost.com", :app, :web, :db, :importer, :primary => true
server "backuphost.com", :app, :web, :db, :backup, :primary => true
set :deploy_to, "/apps/appname"
# Ensure deploy before restart
before 'importer:deploy', 'deploy'
before 'backup:deploy', 'deploy'
# Importer
namespace :importer do
desc "Restart importer service"
task :deploy, :roles => :importer do
sudo "cp #{current_release}/config/importer.conf /etc/init/importer.conf"
sudo "service importer restart N=1"
sudo "service importer restart N=2"
end
end
# Backup
namespace :backup do
desc "Restart backup service"
task :deploy, :roles => :backup do
sudo "cp #{current_release}/config/backup.conf /etc/init/backup.conf"
sudo "service backup restart"
end
end
А затем просто разверните его с помощью cap ROLES=importer importer:deploy
или cap ROLES=backup backup:deploy
. Это дало мне возможность развернуть один и тот же исходный код на разных серверах и выполнить совершенно разные задачи после фактического развертывания.