2011-08-26 15 views
8

Tengo un servidor dedicado para tareas de retraso de trabajo. Quiero iniciar, detener y reiniciar los trabajadores con retardo_trabajo en solo este servidor. Estoy usando las recetas de capistrano provistas por delayed_job.Invocar tareas retrayed_job capistrano solo en servidores específicos

Cuando sólo tenía 1 servidor, este fue mi config:

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

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

Ahora quiero tener esos ganchos única se aplican a un servidor delayed_job separado (role :delayed_job <ip address>). ¿Es posible hacerlo elegantemente? ¿Tengo que ajustar cada tarea de retraso de trabajo en una meta tarea? ¿O escribir mis propias tareas y no utilizar las proporcionadas por el trabajo retrasado?

Respuesta

12

Cuando define una tarea en Capistrano puede restringir la ejecución de la tarea a roles específicos. La forma de hacerlo es pasando la opción :role.

Parece que default delayed_job Capistrano recipe hace esto.

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

De acuerdo con el código fuente, la tarea va a buscar la lista de funciones de la variable de configuración :delayed_job_server_role.

Volver a su problema, para reducir la ejecución de las tareas a un grupo específico de servidores, definir una nueva función (por ejemplo trabajador) en su deploy.rb

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

A continuación, establezca la :delayed_job_server_role a ese nombre

set :delayed_job_server_role, :worker 

Eso es todo. Ahora las tareas se ejecutarán, pero solo para los servidores enumerados en el rol :worker.

+0

¡Yay! Estoy tan feliz. (y voy a ir a documentar esa bandera en su wiki ...) –

Cuestiones relacionadas