我使用普通的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
角色的服务器运行?
答案 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
希望有所帮助!