我正在使用Capistrano来管理在多个负载平衡服务器上运行的Java Web应用程序。某些任务(例如配置更改)需要服务器重新启动或应用程序重新部署,在此期间服务器将无响应。
如果Capistrano可以在服务器上连续执行这些任务,而不是同时执行,那么服务器场中只有一台计算机会一次关闭,负载均衡器将确保没有请求丢失。但是,据我所知,Capistrano只能同时在服务器上执行操作。
要明确,我不是要连续执行不同的任务。我正在尝试连续在不同的服务器上执行相同的任务。
我可以在我的配置中想到一些黑客入侵的方法,但似乎应该有一个我可以在某处设置的标志。
有人知道怎么做吗?
答案 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来源工作得很好,但也需要很多时间。