2012-02-06 54 views
0

我已經構建了一些我需要在定義的:app角色中運行的capistrano任務。這是我到目前爲止有:Capistrano任務在給定範圍內不能執行。

desc "Stop unicorn" 
task :stop, :roles => :app do 
    logger.info "Stopping unicorn server(s).." 
    run "touch #{unicorn_pid}" 
    pid = capture("cat #{unicorn_pid}").to_i 
    run "kill -s QUIT #{pid}" if pid > 0 
end 

據我所知,這應該運行在:app角色給出的服務器上給定的命令,對不對?但事實是,它正在運行:db角色中的服務器上的命令。

任何人都可以對這個問題有所瞭解嗎?或者,有沒有辦法強制Capistrano堅持:roles國旗?提前

//周華健

+0

我調查了一點,事實證明,當它到達這個任務時,'服務器'數組包括*所有*服務器從所有角色(即合併'應用程序','網絡和數據庫)是這種預期的行爲? – 2012-02-06 10:58:46

+0

還有更多。似乎捕獲命令在所有服務器上運行,然後在所有服務器上運行kill命令。這會導致kill命令試圖終止所有服務器上最後一個服務器的ID。對於這種情況,是否有最佳做法,在迭代服務器數組之前,我想在特定服務器上運行一系列命令? – 2012-02-06 11:56:14

+0

你的環境角色設置如何? – phoet 2012-02-06 15:37:36

回答

0

使用Capture將導致任務

由於只列出的第一個服務器上運行。

從文檔:

捕獲助手將第一個匹配的服務器上執行給定的命令,將返回命令的輸出作爲一個字符串。

https://github.com/capistrano/capistrano/wiki/2.x-DSL-Action-Inspection-Capture

不幸的是,我面臨着類似的問題,find_servers解決方案可以工作,但它的哈克,並運行的N×N倍,其中N在你的服務器的數量。