Вызывать задачи delayed_job capistrano только на определенных серверах - PullRequest
8 голосов
/ 27 августа 2011

У меня есть выделенный сервер для задач delayed_job.Я хочу запустить, остановить и перезапустить работников delayed_job на только этом сервере.Я использую рецепты капистрано, предоставляемые delayed_job.

Когда у меня был только 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 <ip address>).Можно ли это сделать элегантно?Должен ли я обернуть каждую задачу delayed_job в мета-задачу?Или написать свои собственные задачи и не использовать те, которые предусмотрены отложенной работой?

1 Ответ

12 голосов
/ 21 сентября 2011

Когда вы определяете задачу в 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

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

Затем установите :delayed_job_server_role на это имя

set :delayed_job_server_role, :worker

Вот и все.Теперь задачи будут выполняться, но только для серверов, перечисленных в роли :worker.

...