当前位置:  开发笔记 > 运维 > 正文

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

如何解决《如何使用Capistrano部署到单个特定服务器》经验,为你挑选了1个好方法。

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



1> Pete Hodgson..:

我结束了张贴Capistrano的用户列表中的问题,在这里,并得到了了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命令,因为(AB)和(C)的交集是空集.(foo的主机列表中没有与C匹配的主机.)

如果这样做cap HOSTFILTER=A foo,它将仅在A上运行echo命令,因为与(A)相交的(AB)是(A).

最后,如果这样做cap HOSTFILTER=A,B,C foo,它将在A和B(但不是C)上运行echo命令,因为(AB)与(ABC)相交的是(AB).

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

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有