我最终在 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 只是过滤现有主机
针对给定的列表,只选择那些已经在
任务服务器列表。