我在生产环境中有一个系统,它有几个服务器,分别扮演不同的角色。我想通过部署到特定的服务器来测试新的应用程序服务器,而不必重新部署到生产中的每台服务器。有没有办法让Capistrano部署到特定的服务器?理想情况下,我希望能够运行以下内容
cap SERVER=app2.example.com ROLE=app production deploy
如果我只是想部署到app2.example.com。
谢谢!
更新我尝试了武隆建议的解决方案,执行:
cap HOSTS=app2.server.hostname ROLE=app qa deploy
但capistrano似乎试图在该服务器上执行除应用程序任务之外的其他角色的任务。也许我需要更新我的cap版本(我运行的是v2.2.0)?
发布于 2009-01-22 19:59:03
我最终在capistrano用户列表here上发布了一个问题,并从Jamis那里得到了以下回复(为了清楚起见,我在这里编辑了一下):
尝试HOSTS环境变量:
cap HOSTS=app2.example.com production deploy
请注意,这样做会将app2视为在每个角色中,而不仅仅是在恰好声明它的角色中。
如果您想要执行常规部署,但仅对app2执行操作,并且仅在您的配方文件中声明了app2,则可以使用HOSTFILTER变量:
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命令,因为(A、B)和(C)的交集是一个空集。(foo的主机列表中没有与C匹配的主机。)
如果您执行cap HOSTFILTER=A foo
,它将只在A上运行echo命令,因为( A,B)与(A)相交的是(A)。
最后,如果您执行cap HOSTFILTER=A,B,C foo
,它将在A和B(而不是C)上运行echo命令,因为(A、B)与(A、B、C)相交的是(A、B)。
总而言之:主机完全覆盖任务的主机或角色声明,并强制所有内容在指定的主机上运行。另一方面,HOSTFILTER只是根据给定的列表过滤现有主机,只选择那些已经在任务服务器列表中的服务器。
发布于 2009-01-11 00:49:47
以下内容应该开箱即用:
cap HOSTS=app2.example.com ROLE=app deploy
如果您希望部署到具有相同角色的>1台服务器:
cap HOSTS=app2.example.com,app3.example.com,app4.example.com ROLE=app deploy
发布于 2011-01-24 10:00:02
我也有类似的问题,并尝试了以下方法。它是有效的:
cap production ROLES=web HOSTS=machine1 stats
https://stackoverflow.com/questions/429816
复制相似问题