Как вы по-разному определяете одни и те же задачи для разных ролей в Capistrano? - PullRequest
10 голосов
/ 10 августа 2010

Я использую Capistrano для управления моим развертыванием, и у меня есть две разные роли в моей настройке -: web и: processing. Они оба имеют обычные задачи: deploy, но задача: restart должна отличаться для двух типов серверов.

Итак, моя первая попытка была примерно такой:

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 никогда не происходит.

Я быстро огляделся, чтобы посмотреть, смогу ли я написать условный код в зависимости от того, в какой роли (или ролях) может находиться сервер, когда выполняется задача, но там нет документации для такого рода вещей. Есть идеи?

Ответы [ 3 ]

7 голосов
/ 10 августа 2010

Вы должны использовать пространства имен:

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

(Источник: я сопровождающий Capistrano.)

1 голос
/ 09 августа 2011

Вы должны использовать «параллельно» вместо «запустить» в этом случае:

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

Если вы собираетесь использовать что-то кроме «запустить» в разных задачах, вам лучше придерживаться одного из других ответов.

Более подробную информацию о «параллельной» команде можно найти здесь: https://github.com/capistrano/capistrano/wiki/2.x-DSL-Action-Invokation-Parallel

0 голосов
/ 15 ноября 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...