2010-11-05 31 views
16

我正在使用Capistrano來管理在多個負載平衡服務器上運行的Java Web應用程序。某些任務(如配置更改)需要重新啓動服務器或重新部署應用程序,在此期間服務器變得無法響應。Can Capistrano可以連續執行主機上的任務嗎?

如果Capistrano的可以執行服務器上的這些任務連續,同時對比,場中只有一臺機器會在同一時間下降後,負載平衡器將確保沒有任何請求都將丟失。然而,據我所知,Capistrano只能同時在服務器上執行操作。

要清楚,我不是要連續執行不同的任務。我試圖在不同的服務器上連續執行相同的任務。

我能想到的在我的配置黑客這個的一些方法,但似乎應該有一個標誌,我可以設置的地方。

任何人都知道如何做到這一點?

回答

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 
+0

這工作完美。謝謝。 – devinfoley 2011-03-18 16:21:55

+0

非常感謝!它工作完美。 – raskhadafi 2012-09-24 14:56:28

+2

太棒了!順便說一句,也許帽應該添加一個策略執行任務的順序。 – DiveInto 2013-10-18 08:02:50

-1

嗨它不Capistrano的縫可能很容易,當然可以採取一些方法。

1),你可以指定不同的角色每個服務器,並添加負責角色的旋轉和調用,它實際需要的任務的任務一個單獨的任務。

2)你可以寫單獨的腳本做旋轉同上,但使用不同的主機名,而不是角色

3),還可以過濾主機名/使用環境變量Capistrano的服務器,也許你可以在使用它旋轉算法。

不幸的是,對於我來說,capistrano沒有很好的文檔可以閱讀capistrano資源,效果很好,但也需要花費很多時間。

+0

感謝您的信息描述,您可以使用in: :sequence。不是我所希望的答案,但真相很痛苦。我可能會嘗試分叉並添加此功能。 – devinfoley 2010-11-08 23:40:10

16

您可以設置:max_hosts爲任務,以限制其並行:

:max_hosts - 指定的最大數量應該一次選擇的主機。如果此值小於選擇運行的主機數,則主機將以max_hosts組運行。缺省值爲零,表示沒有最大主機限制。請注意,這不會限制可以打開的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

Capistrano的3使用SSHKit其提供用於順序發送命令的到多個服務器。有一個在SSHKit一個例子給我讀:

https://github.com/capistrano/sshkit

注意,Capistrano的3是Capistrano的2.x版本有相當的改觀

相關問題