我的生产系统有几个角色的服务器。我想通过部署到该特定服务器来测试新的应用服务器,而无需重新部署到生产中的每个服务器。有没有办法让Capistrano部署到特定的服务器?理想情况下,我希望能够运行像
这样的东西cap SERVER=app2.example.com ROLE=app production deploy
如果我只想部署到app2.example.com。
谢谢!
[更新] 我通过执行:
尝试了wulong建议的解决方案cap HOSTS=app2.server.hostname ROLE=app qa deploy
但是除了app任务之外,capistrano似乎还试图为该服务器上的其他角色执行任务。也许我需要更新我的上限版本(我正在运行v2.2.0)?
答案 0 :(得分:124)
我最后在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
,它将仅运行echo命令
A,因为(A B)与(A)相交的是(A)。
最后,如果你执行cap HOSTFILTER=A,B,C foo
,它将运行回声
命令A和B(但不是C),因为(A B)与(A B C)相交
是(A B)。
总结:HOSTS完全覆盖主机或角色声明 任务,并强制一切对指定的主机运行。 另一方面,HOSTFILTER只是过滤现有的主机 针对给定列表,仅选择已经存在的服务器 任务服务器列表。
答案 1 :(得分:3)
以下内容应该开箱即用:
cap HOSTS=app2.example.com ROLE=app deploy
如果要部署到具有相同角色的> 1服务器:
cap HOSTS=app2.example.com,app3.example.com,app4.example.com ROLE=app deploy
答案 2 :(得分:2)
我有类似的问题并尝试了以下内容。它有效:
cap production ROLES=web HOSTS=machine1 stats
答案 3 :(得分:1)
您应该可以在deploy.rb中执行类似的操作:
task :production do
if ENV['SERVER'] && ENV['ROLE']
role ENV['ROLE'], ENV['SERVER']
else
# your full config
end
end
答案 4 :(得分:0)
您还可以通过以下方式指定任务级主机参数:
task :ship_artifacts, :hosts => ENV['DEST_HOST'] do
end