Как вы определяете одни и те же задачи по-разному для разных ролей в 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. Это дало мне возможность развернуть один и тот же исходный код на разных серверах и выполнить совершенно разные задачи после фактического развертывания.