Capistrano可以连续执行主机上的任务吗?

时间:2010-11-05 22:22:22

标签: capistrano

我正在使用Capistrano来管理在多个负载平衡服务器上运行的Java Web应用程序。某些任务(例如配置更改)需要服务器重新启动或应用程序重新部署,在此期间服务器将无响应。

如果Capistrano可以在服务器上连续执行这些任务,而不是同时执行,那么服务器场中只有一台计算机会一次关闭,负载均衡器将确保没有请求丢失。但是,据我所知,Capistrano只能同时在服务器上执行操作。

要明确,我不是要连续执行不同的任务。我正在尝试连续在不同的服务器上执行相同的任务。

我可以在我的配置中想到一些黑客入侵的方法,但似乎应该有一个我可以在某处设置的标志。

有人知道怎么做吗?

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:4)

Capistrano 3使用SSHKit,它提供顺序向多个服务器发送命令。在SSHKit上有一个例子给我读了一遍:

https://github.com/capistrano/sshkit

注意,Capistrano 3与Capistrano 2.x完全不同。

答案 3 :(得分:1)

对于现在在此页面中结束的人:您可以按http://capistranorb.com/2013/06/01/release-announcement.html

中所述使用in: :sequence

答案 4 :(得分:-1)

嗨,它很容易在capistrano中切割,当然可以采取一些方法。

1)您可以指定不同角色的每个服务器,并添加一个单独的任务,负责轮换角色并调用执行实际所需任务的任务。

2)您可以像上面那样编写单独的脚本进行轮换,但使用不同的主机名而不是角色

3)也可以使用环境变量过滤capistrano中的主机名/服务器,也许你可以在旋转算法中使用它。

不幸的是,对于我来说,没有好的文件证明capistrano读取capistrano来源工作得很好,但也需要很多时间。