2010-11-05 2 views
16

Я использую Capistrano для управления веб-приложением Java, которое работает на нескольких серверах с балансировкой нагрузки. Некоторые задачи (например, изменения конфигурации) требуют перезапуска сервера или повторного развертывания приложения, во время которого сервер становится невосприимчивым.Может ли Capistrano выполнять задачи на хостах последовательно?

Если Capistrano может выполнять эти задачи на серверах последовательно, то одновременно, только одна машина в ферме будет снижаться одновременно, а балансировщик нагрузки гарантирует, что никакие запросы не будут потеряны. Однако, из того, что я могу сказать, Capistrano только выполняет операции на серверах одновременно.

Чтобы быть ясным, я не пытаюсь выполнять различные задачи последовательно. Я пытаюсь выполнить одну и ту же задачу на разных серверах последовательно.

Я могу подумать о некоторых способах взлома этого в моей конфигурации, но, похоже, должен быть флаг, который я могу установить где-нибудь.

Кто-нибудь знает, как это сделать?

ответ

19

Я использую это, чтобы перезапустить свои серверы в серии, а параллельно:

task :my_task, :roles => :web do 
    find_servers_for_task(current_task).each do |server| 
    run "[task command here]", :hosts => server.host 
    end 
end 
+0

Это сработало отлично. Спасибо. – devinfoley

+0

Спасибо большое! Он работает отлично. – raskhadafi

+2

потрясающий! btw, возможно, cap должен добавить стратегию для выполнения задачи exec в последовательности. – DiveInto

-1

Привет, это невозможно сделать в capistrano легко, конечно, некоторые подходы могут быть приняты.

1) вы можете указать каждый сервер в другой роли и добавить отдельную задачу, ответственную за ротацию ролей и вызов задачи, которая действительно требует задания.

2) вы могли бы написать отдельный скрипт делает вращение, как описано выше, но с использованием различных имен хостов вместо ролей

3) Кроме того, можно фильтровать имена хостов/серверов в Capistrano с помощью переменной окружения, может быть, вы могли бы использовать его в в алгоритме вращения.

К сожалению, нет никакой хорошей документации для capistrano для меня, чтобы читать источники capistrano работали достаточно хорошо, но это требует также много времени.

+0

Спасибо за информацию.Не тот ответ, на который я надеялся, но правда болит. Я могу попытаться разблокировать и добавить эту функцию. – devinfoley

16

Вы можете установить :max_hosts для выполнения этой задачи, чтобы ограничить его параллелизм:

:max_hosts - определяет максимальное число хостов, которые следует выбирать за раз. Если это значение меньше количества хостов, выбранных для запуска, то хосты будут запускаться группами max_hosts. По умолчанию используется значение nil, что указывает на отсутствие максимального ограничения на хост. Обратите внимание, что это не ограничивает количество открытых каналов SSH, а только количество хостов, на которые будет вызываться.

Пример:

desc "Say hello, one at a time" 
task :hello, :roles => :app, :max_hosts => 1 do 
    run "echo serial hello ; sleep 0 ; echo serial hello DONE" 
    # Note that task parameters do NOT get automatically passed on to 
    # other tasks, i.e. a call to "deploy:restart" would be 
    # unaffected by :max_hosts set here. Example: 
    self.send(:normal_hello) 
end 

desc "Say hello, everybody" 
task :normal_hello, :roles => :app do 
    run "echo 'normal (parallel) hello' ; sleep 10 ; echo normal hello DONE" 
end 
4

Капистранен 3 использует SSHKit, который предусматривает последовательную отправку команд на несколько серверов. Там пример на SSHKit прочитал мне:

https://github.com/capistrano/sshkit

Примечание, Capistrano 3 вполне переход от Capistrano 2.x.

Смежные вопросы