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

时间:2010-08-10 07:55: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

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

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

3 个答案:

答案 0 :(得分: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

我认为这就是你要找的东西!

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

$ 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

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

答案 1 :(得分:1)

在这种情况下,您应该使用'parallel'而不是'run':

task :restart do
  parallel do |session|
    session.when "in?(:web)", "...substitute run command contents here...."
    session.when "in?(:process)", "...substitute run command contents here...."
  end
end

如果你打算在不同的任务中使用“跑步”以外的东西,你最好坚持其他一个答案。

有关'parallel'命令的更多信息,请访问:https://github.com/capistrano/capistrano/wiki/2.x-DSL-Action-Invokation-Parallel

答案 2 :(得分:0)

如果您需要调用默认的deploy任务,并进行一些自定义重启等,我想出了这个解决方案:

# Servers
server "importerhost.com", :app, :web, :db, :importer, :primary => true
server "backuphost.com",   :app, :web, :db, :backup,   :primary => true
set :deploy_to, "/apps/appname"

# Ensure deploy before restart
before 'importer:deploy', 'deploy'
before 'backup:deploy',   'deploy'

# Importer
namespace :importer do
  desc "Restart importer service"
  task :deploy, :roles => :importer do
    sudo "cp #{current_release}/config/importer.conf /etc/init/importer.conf"
    sudo "service importer restart N=1"
    sudo "service importer restart N=2"
  end
end

# Backup
namespace :backup do
  desc "Restart backup service"
  task :deploy, :roles => :backup do
    sudo "cp #{current_release}/config/backup.conf /etc/init/backup.conf"
    sudo "service backup restart"
  end
end

然后只需使用cap ROLES=importer importer:deploycap ROLES=backup backup:deploy进行部署。这使我可以自由地将相同的源代码部署到不同的服务器,并在实际部署后执行完全不同的任务。

相关问题