2009-01-09 87 views
53

我有一個生產系統,有幾個角色的服務器。我想通過部署到特定的服務器來測試新的應用程序服務器,而無需重新部署到生產中的每臺服務器。有沒有辦法讓Capistrano部署到特定的服務器?理想情況下,我希望能夠運行如如何使用Capistrano部署到單個特定服務器

cap SERVER=app2.example.com ROLE=app production deploy 

如果我只是想部署到app2.example.com。

謝謝!

[更新] 我試圖通過武隆建議的解決方案通過執行:

cap HOSTS=app2.server.hostname ROLE=app qa deploy 

但Capistrano的似乎是想除了應用程序的任務是在服務器上執行的其他角色的任務。也許我需要更新我的版本的帽子(我正在運行v2.2.0)?

回答

122

我最終在capistrano用戶列表中發佈了一個問題here,並得到了了Jamis以下響應(由我編輯了一下這裏的清晰度):


嘗試主機環境變量:

cap HOSTS=app2.example.com production deploy 

注意,這樣做會把APP 2中的每一個角色是,不只是 哪個角色(一個或多個),它發生在聲明。

如果你想要的是做一個普通的部署,但只作用於APP 2,和 只APP2在你的食譜文件中聲明,你可以使用HOSTFILTER 變量,而不是:

cap HOSTFILTER=app2.example.com production deploy 

[...]

考慮這個具體例子。假設你 腳本定義了三個服務器,A,B和C.它定義了一個任務,「富」,即 (默認),希望在A和B上運行,而不是C.像這樣:

role :app, "A", "B" 
role :web, "C" 

task :foo, :roles => :app do 
    run "echo hello" 
end 

現在,如果你這樣做cap foo,將A和B都

運行echo命令

如果你這樣做cap HOSTS=C foo,它將運行在C中的echo命令, 不管:角色參數的任務。

如果你做cap HOSTFILTER=C foo,它將不會在 全部運行echo命令,因爲(A B)和(C)的交集是空集。(有 在Foo的主機列表中沒有主機匹配C.是)

如果你這樣做cap HOSTFILTER=A foo,它只能運行在 一個echo命令,因爲(A B)與(A)相交是(A)。

最後,如果你這樣做cap HOSTFILTER=A,B,C foo,它將運行在A和B(但不是C)回聲 命令,因爲(A B)與相交(A B C) 是(A B)。總結:HOSTS完全覆蓋了任務的主機或角色聲明 ,並強制所有內容針對指定的主機運行。 另一方面,HOSTFILTER僅針對給定列表過濾現有主機 ,只選擇那些已在 任務服務器列表中的服務器。

1

你應該能夠做這樣的事情在deploy.rb:

task :production do 
    if ENV['SERVER'] && ENV['ROLE'] 
    role ENV['ROLE'], ENV['SERVER'] 
    else 
    # your full config 
    end 
end 
3

下面應該工作開箱:

cap HOSTS=app2.example.com ROLE=app deploy 

如果要部署到> 1個服務器具有相同的角色:

cap HOSTS=app2.example.com,app3.example.com,app4.example.com ROLE=app deploy 
+1

我通過執行 帽HOSTS = app2.server嘗試第一種情況(部署到一個單一的應用程序服務器) .hostname ROLE = app qa deploy 但是除了應用程序任務之外,capistrano似乎正在嘗試爲該服務器上的其他角色執行任務。也許我需要更新我的版本的帽子(我正在運行2.2.0)。 – 2009-01-13 22:07:02

+0

HOSTFILTER是答案,這不是你想要的。 – 2016-09-15 12:50:07

1

我有類似的問題,並嘗試以下。它的工作原理:

cap production ROLES=web HOSTS=machine1 stats 
0

您也可以指定地址任務級別的主機參數是這樣的:

task :ship_artifacts, :hosts => ENV['DEST_HOST'] do 

end 
相關問題