如何为Capistrano中的不同角色定义相同的任务?

Tim*_*ane 10 ruby capistrano

我正在使用Capistrano来处理我的部署,我在我的设置中有两个不同的角色 - 网络和:处理.它们都具有通常的:部署任务,但是:对于两种类型的服务器,:restart任务需要不同.

所以我的第一次尝试是这样的:

task :restart, :roles => :web do
    run "... web related restart stuff ..."
end

task :restart, :roles => :processing do
    run "... processing related restart stuff ..."
end
Run Code Online (Sandbox Code Playgroud)

哪个不起作用,因为第二个:restart(for:处理角色)替换第一个:restart(对于:web角色),而:web:restart永远不会发生.

我快速浏览了一下,看看我是否可以编写条件代码,具体取决于运行任务时服务器可能处于哪个角色(或角色)但是旁边没有任何文档用于此类事情.有任何想法吗?

Lee*_*ley 7

您应该使用名称空间:

namespace :web do
  desc "Restart web servers"
  task :restart, :roles => :web do
    # Restart Magic Here
  end
end

namespace :process do
  desc "Restart process servers"
  task :restart, :roles => :process do
    # Restart magic here
  end
end

# Optionally:
task :restart do
  web.restart
  process.restart
end
Run Code Online (Sandbox Code Playgroud)

这就是我想要的!

另外,要在命令行中使用这些,您可以使用

$ cap <stage>           # (if using multistage)
$ cap web:restart       # Restarts web servers
$ cap process:restart   # Restarts process servers
$ cap restart           # Restarts both process and web servers
Run Code Online (Sandbox Code Playgroud)

(来源:我是Capistrano的维护者.)