如何使用Capistrano将其部署到单个特定服务器

我有一个生产系统有几个angular色的几个服务器。 我想通过部署到特定服务器来testing新的应用程序服务器,而不必重新部署到生产中的每个服务器。 有没有办法让Capistrano部署到特定的服务器? 理想情况下,我想能够运行类似的东西

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

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

谢谢!

[更新]我尝试了武隆build议的解决scheme,执行:

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

但是除了app任务之外,capistrano似乎正在尝试为该服务器上的其他angular色执行任务。 也许我需要更新我的版本的帽子(我正在运行v2.2.0)?

我最终在这里发表了一个关于capistrano用户列表的问题 ,并得到了Jamis的以下回应(为了清楚起见,我在这里编辑了一下):


试试HOSTS环境variables:

 cap HOSTS=app2.example.com production deploy 

请注意,这样做会将app2视为处于每个angular色,而不仅仅是发生在其中的任何angular色。

如果你想要做的是定期部署,但只对app2起作用,并且只有在你的配方文件中声明了app2,你可以使用HOSTFILTERvariables:

 cap HOSTFILTER=app2.example.com production deploy 

[…]

考虑一下这个具体的例子。 假设你的脚本定义了三个服务器A,B和C.它定义了一个任务“foo”,默认情况下它想在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命令,而不考虑任务的roles参数。

如果你设置cap HOSTFILTER=C foo ,那么根本就不会运行echo命令,因为(AB)和(C)的交集是空集。 (foo的主机列表中没有与C匹配的主机)

如果你设置了cap HOSTFILTER=A foo ,那么只会在A上运行echo命令,因为(AB)与(A)相交的是(A)。

最后,如果你设置了cap HOSTFILTER=A,B,C foo ,那么它将在A和B(但不是C)上运行echo命令,因为(AB)与(ABC)相交为(AB)。

总结一下:HOSTS完全覆盖了任务的主机或angular色声明,并强制所有的东西在指定的主机上运行。 另一方面,HOSTFILTER只是根据给定的列表过滤现有的主机,只select那些已经在任务服务器列表中的服务器。

以下应该开箱即用:

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

如果您要部署到具有相同angular色的> 1个服务器:

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

你应该可以在deploy.rb中做这样的事情:

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

我有类似的问题,并尝试以下。 有用:

 cap production ROLES=web HOSTS=machine1 stats 

您也可以通过这种方式指定任务级主机参数:

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