Может ли Capistrano последовательно выполнять задачи на хостах? - PullRequest
16 голосов
/ 06 ноября 2010

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

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

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

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

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

Ответы [ 5 ]

19 голосов
/ 01 января 2011

Я использую это для перезапуска своих серверов последовательно, а не параллельно:

task :my_task, :roles => :web do
  find_servers_for_task(current_task).each do |server|
    run "[task command here]", :hosts => server.host
  end
end
16 голосов
/ 31 мая 2011

Вы можете установить :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 голосов
/ 01 января 2014

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

https://github.com/capistrano/sshkit

Обратите внимание, что Capistrano 3 довольно сильно отличается от Capistrano 2.x.

1 голос
/ 07 марта 2017

Для людей, которые в настоящее время попадают на эту страницу: Вы можете использовать in: :sequence, как описано в http://capistranorb.com/2013/06/01/release-announcement.html

0 голосов
/ 06 ноября 2010

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

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

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

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

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

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