仅在特定服务器上调用delayed_job capistrano任务

我有一个用于delayed_job任务的专用服务器。 我想只在这台服务器上启动,停止和重启delayed_job worker。 我正在使用delayed_job提供的capistrano食谱。

当我只有1台服务器时,这是我的配置:

before "deploy:restart", "delayed_job:stop" after "deploy:restart", "delayed_job:start" after "deploy:stop", "delayed_job:stop" after "deploy:start", "delayed_job:start" 

现在我想让这些钩子适用于一个单独的delayed_job服务器( role :delayed_job )。 这可能优雅吗? 我是否必须在meta任务中包装每个delayed_job任务? 或者写我自己的任务而不是使用延迟工作提供的任务?

在Capistrano中定义任务时,可以将任务的执行限制为特定角色。 执行此操作的方法是传递:role选项。

似乎默认的delayed_job Capistrano配方就是这样做的。

 desc "Stop the delayed_job process" task :stop, :roles => lambda { roles } do run "cd #{current_path};#{rails_env} script/delayed_job stop" end 

根据源代码,任务从:delayed_job_server_role配置变量中获取角色列表。

回到您的问题,将任务的执行范围缩小到特定的服务器组,在deploy.rb定义一个新角色(例如worker)

 role :worker, "192.168.1.1" # Assign the IP of your machine 

然后将:delayed_job_server_role设置为该名称

 set :delayed_job_server_role, :worker 

就这样。 现在,任务将被执行,但仅限于:worker角色中列出的服务器。