Ответ 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
Я использую Capistrano для управления веб-приложением Java, которое выполняется на нескольких серверах с балансировкой нагрузки. Некоторые задачи (например, изменения конфигурации) требуют перезапуска сервера или повторного развертывания приложения, в течение которого сервер становится невосприимчивым.
Если Capistrano может выполнять эти задачи на серверах последовательно, одновременно и одновременно, только одна машина в ферме будет снижаться одновременно, а балансировщик нагрузки гарантирует, что никакие запросы не будут потеряны. Однако, из того, что я могу сказать, Capistrano только выполняет операции на серверах одновременно.
Чтобы быть ясным, я не пытаюсь выполнять разные задачи последовательно. Я пытаюсь выполнить одну и ту же задачу на разных серверах последовательно.
Я могу думать о некоторых способах взлома этого в моей конфигурации, но кажется, что должен быть флаг, который я могу установить где-то.
Кто-нибудь знает, как это сделать?
Я использую это, чтобы перезапустить мои серверы последовательно, а не параллельно:
task :my_task, :roles => :web do
find_servers_for_task(current_task).each do |server|
run "[task command here]", :hosts => server.host
end
end
Вы можете установить :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
Capistrano 3 использует SSHKit, который обеспечивает последовательную отправку команд нескольким серверам. Там пример на SSHKit читал меня:
https://github.com/capistrano/sshkit
Примечание. Capistrano 3 - это совсем другое изменение от Capistrano 2.x.
Для людей, которые попадают на эту страницу в настоящее время: вы можете использовать in: :sequence
, как описано в http://capistranorb.com/2013/06/01/release-announcement.html
Привет, это невозможно сделать в capistrano легко, конечно, некоторые подходы могут быть приняты.
1) вы можете указать каждый сервер в другой роли и добавить отдельную задачу, ответственную за ротацию ролей и вызов задачи, которая действительно требует задания.
2) вы можете написать отдельный script выполнение вращения, как указано выше, но используя разные имена хостов вместо ролей
3) также можно фильтровать имена хостов/серверов в capistrano с использованием переменной окружения, возможно, вы можете использовать его в алгоритме вращения.
К сожалению, нет никакой хорошей документации для capistrano, так как я читаю, что источники capistrano работали достаточно хорошо, но это занимает много времени.