我最终在capistrano用户列表这里发布了一个问题,并从Jamis那里得到以下回复(为了清晰起见,这里稍作编辑):
尝试使用HOSTS环境变量:
cap HOSTS=app2.example.com production deploy
请注意,这样做将把app2视为每个角色而不仅仅是其声明的任何角色。
如果您想进行常规部署,但仅在处理recipe文件中声明的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上运行echo命令,
因为(A B)与(A)的交集为(A)。
最后,如果您执行cap HOSTFILTER=A,B,C foo
,它将在A和B(但不是C)上运行echo命令,
因为(A B)与(A B C)的交集为(A B)。
总之:
HOSTS完全覆盖任务的主机或角色声明,并强制所有内容都针对指定的主机运行。
另一方面,HOSTFILTER只是根据给定列表过滤现有主机,
仅选择已在任务服务器列表中的那些服务器。