如何在capistrano 2.x中禁用一个角色的默认部署流程?

时间:2014-02-04 16:25:55

标签: ruby deployment capistrano

我使用普通的capistrano来部署一个用节点编写的简单集群。

我将角色定义如下:

role :boss, "bosshost"
role :worker, { get_worker_hosts }

我正在使用capistrano的默认部署舞蹈+自己的任务将worker应用程序放在服务器上。

问题是我不想要boss的任何内容,因为它只是一个脚本。理想情况下这样做:

namespace :boss
  task :update, :roles => [:boss]
    upload 'boss.js', "#{boss_home}/boss.js"
  end
  task :restart, :roles => [:boss]
    run "forever restart #{boss_home}/boss.js"
  end
end

我在:roles => [:worker]之后发生的所有与工作人员相关的任务中使用了deploy:finalize_update。但是,运行$ cap deploy仍然会在boss服务器上放置不必要的内容。

如何告诉capistrano deploy任务和以下默认任务只应针对worker角色的服务器运行?

1 个答案:

答案 0 :(得分:3)

我也能够为自己解决这个问题。在我的特定情况下,我需要将应用程序部署到一个服务器,因为应用程序集群使用的是NFS安装,但我需要在部署完成后重新启动应用程序集群中所有服务器上的节点守护程序。

这是我的解决方案,即为每个服务器设置角色(您也可以使用role):

server 'a-server.com', :app, :web, :service
server 'another-server.com', :service, :no_release => true

密钥是:no_release => true,因此代码不会部署到此服务器。内置任务将遵循此指南,我还有一些自定义任务。我通过查看并行运行的任务的部署输出并添加以下内容来解决自定义任务:

task "my_task", :except => { :no_release => true } do
  # do stuff here...
  # Example of using a role with `run`
  run "sudo /etc/init.d/nodejs-#{application} restart", :roles => :service
end

希望有所帮助!