gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:47:25 24 4
gpt4 key购买 nike

我有一个生产系统,其中有多个具有多个角色的服务器。我想通过部署到特定服务器来测试新的应用程序服务器,而不必重新部署到生产中的每个服务器。有没有办法让 Capistrano 部署到特定服务器?理想情况下,我希望能够运行类似的东西

cap SERVER=app2.example.com ROLE=app production deploy

如果我只想部署到 app2.example.com。

谢谢!

[更新]我通过执行以下命令尝试了 wulong 建议的解决方案:

cap HOSTS=app2.server.hostname ROLE=app qa deploy 

但除了应用程序任务之外,capistrano 似乎还尝试在该服务器上执行其他角色的任务。也许我需要更新我的 cap 版本(我正在运行 v2.2.0)?

最佳答案

我最终在 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,因为(A B)与(A)相交是(A)。

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

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

关于deployment - 如何使用 Capistrano 部署到单个特定服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/429816/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com