【问题标题】:How do I disable default deploy flow for one role in capistrano 2.x?如何在 capistrano 2.x 中禁用一个角色的默认部署流程?
【发布时间】:2025-11-28 22:20:03
【问题描述】:

我正在使用普通 capistrano 部署一个用 node 编写的简单集群。

我定义的角色如下:

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

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

我如何告诉 capistrano deploy 任务和以下默认任务应该只为具有 worker 角色的服务器运行?

【问题讨论】:

  • 我也一直在网上搜索,试图弄清楚这一点。

标签: ruby deployment capistrano


【解决方案1】:

我自己也能解决这个问题。在我的特殊情况下,由于应用程序集群使用 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

希望有帮助!

【讨论】: