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

Deployment 如何使用Capistrano部署到单个特定服务器,deployment,capistrano,release-management,Deployment,Capistrano,Release Management,我在生产中有一个系统,它有多个服务器,扮演多个角色。我想通过部署到特定的服务器来测试新的应用服务器,而不必重新部署到生产中的每台服务器。有没有办法让Capistrano部署到特定的服务器?理想情况下,我希望能够像 cap SERVER=app2.example.com ROLE=app production deploy 如果我只是想部署到app2.example.com 谢谢 [更新] 我尝试了武龙建议的解决方案,执行: cap HOSTS=app2.server.hostname ROLE

我在生产中有一个系统,它有多个服务器,扮演多个角色。我想通过部署到特定的服务器来测试新的应用服务器,而不必重新部署到生产中的每台服务器。有没有办法让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)?

您应该能够在deploy.rb中执行类似的操作:

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

以下内容应在开箱即用:

cap HOSTS=app2.example.com ROLE=app deploy
如果要部署到具有相同角色的>1台服务器:

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

最后,我在capistrano用户列表上发布了一个问题,并从Jamis那里得到了以下回复(为了清晰起见,我在这里编辑了一些内容):


请尝试主机环境变量:

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
现在,如果执行
capfoo
,它将在A和B上运行echo命令

如果执行
caphosts=cfoo
,它将在C上运行echo命令, 无论任务的:roles参数是什么

如果您执行cap HOSTFILTER=C foo,它将不会在 因为(ab)和(C)的交集是一个空集。(那里 foo的主机列表中没有与C匹配的主机。)

如果执行
cap HOSTFILTER=A foo
,它将仅在上运行echo命令 A、 因为(ab)与(A)相交就是(A)

最后,如果执行
cap HOSTFILTER=A、B、C foo
,它将运行echo A和B(但不是C)上的命令,因为(A B)与(A B C)相交 是A(B)

总结:主机完全覆盖主机或角色声明 并强制在指定主机上运行所有内容。 另一方面,HOSTFILTER只是过滤现有主机 根据给定的列表,仅选择已在中的服务器
任务服务器列表。

我遇到类似问题,并尝试了以下操作。它的工作原理是:

cap production ROLES=web HOSTS=machine1 stats

您还可以通过以下方式指定任务级主机参数:

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

end 

我通过执行cap HOSTS=app2.server.hostname ROLE=app qa deploy尝试了第一种情况(部署到单个应用程序服务器),但capistrano似乎正在尝试为该服务器上的其他角色执行除应用程序任务之外的任务。也许我需要更新我的cap版本(我运行的是2.2.0)。HOSTFILTER就是答案,这不是你想要的。在Capistrano 3中,这似乎不再适用于Capistrano 3.4。在Capistrano 3中,你将对Capistrano 2中的HOSTFILTER使用HOSTS环境变量。