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

时间:2009-01-09 21:28:28

标签: deployment capistrano release-management

我的生产系统有几个角色的服务器。我想通过部署到该特定服务器来测试新的应用服务器,而无需重新部署到生产中的每个服务器。有没有办法让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)?

5 个答案:

答案 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