2009-01-09 114 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 
相关问题