Подтвердить что ты не робот

Может ли Capistrano выполнять задачи на хостах последовательно?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

: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

Ответ 3

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

https://github.com/capistrano/sshkit

Примечание. Capistrano 3 - это совсем другое изменение от Capistrano 2.x.

Ответ 5

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

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

2) вы можете написать отдельный script выполнение вращения, как указано выше, но используя разные имена хостов вместо ролей

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

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