2010-11-05 13 views
16

Estoy usando Capistrano para administrar una aplicación web Java que se ejecuta en varios servidores con equilibrio de carga. Ciertas tareas (como cambios de configuración) requieren un reinicio del servidor o la implementación de la aplicación, durante la cual el servidor deja de responder.¿Puede Capistrano ejecutar tareas en hosts de forma consecutiva?

Si Capistrano pudiera realizar estas tareas en servidores consecutivamente, frente a concurrentemente, solo una máquina en la granja bajaría a la vez, y el equilibrador de carga aseguraría que no se pierdan solicitudes. Sin embargo, por lo que puedo decir, Capistrano solo realiza operaciones en servidores al mismo tiempo.

Para ser claros, no estoy tratando de ejecutar diferentes tareas consecutivamente. Estoy intentando ejecutar la misma tarea en diferentes servidores consecutivamente.

Puedo pensar en algunas formas de hackear esto en mi configuración, pero parece que debería haber una bandera que pueda establecer en alguna parte.

¿Alguien sabe cómo hacer esto?

Respuesta

19

Lo utilizo para reiniciar mis servidores en serie, en lugar de en paralelo:

task :my_task, :roles => :web do 
    find_servers_for_task(current_task).each do |server| 
    run "[task command here]", :hosts => server.host 
    end 
end 
+0

Esto funcionó perfectamente. Gracias. – devinfoley

+0

¡Muchas gracias! Funciona perfecto. – raskhadafi

+2

increíble! Por cierto, tal vez el límite debería agregar una estrategia para ejecutar la tarea en secuencia. – DiveInto

-1

Hola, no se puede hacer en capistrano fácilmente, por supuesto, se pueden tomar algunos enfoques.

1) podría especificar cada servidor en un rol diferente y agregar una tarea separada responsable de la rotación de roles y llamar a la tarea que realmente requiere la tarea.

2) se podría escribir la escritura por separado haciendo la rotación que el anterior pero utilizando diferentes nombres de host en lugar de papeles

3) También es posible filtrar los nombres de host/servidores en Capistrano utilizando la variable de entorno, tal vez usted podría utilizarlo en en algoritmo de rotación.

Desafortunadamente no hay una buena documentación para capistrano para mí, porque las fuentes de Capistrano han funcionado bastante bien, pero también lleva mucho tiempo.

+0

Gracias por la información.No es la respuesta que esperaba, pero la verdad duele. Podría intentar bifurcar y agregar esta característica. – devinfoley

16

Es posible ajustar :max_hosts para la tarea de limitar su paralelismo:

:max_hosts - especifica el número máximo de hosts que deberían seleccionarse a la vez. Si este valor es menor que el número de hosts que se seleccionan para ejecutarse, los hosts se ejecutarán en grupos de max_hosts. El valor predeterminado es nulo, lo que indica que no hay un límite máximo de host. Tenga en cuenta que esto no limita la cantidad de canales SSH que pueden abrirse, solo la cantidad de hosts a los que se llamará.

Ejemplo:

desc "Say hello, one at a time" 
task :hello, :roles => :app, :max_hosts => 1 do 
    run "echo serial hello ; sleep 0 ; echo serial hello DONE" 
    # Note that task parameters do NOT get automatically passed on to 
    # other tasks, i.e. a call to "deploy:restart" would be 
    # unaffected by :max_hosts set here. Example: 
    self.send(:normal_hello) 
end 

desc "Say hello, everybody" 
task :normal_hello, :roles => :app do 
    run "echo 'normal (parallel) hello' ; sleep 10 ; echo normal hello DONE" 
end 
4

Capistrano 3 utiliza SSHKit que proporciona para el envío secuencial de los comandos a varios servidores. Hay un ejemplo en el SSHKit me leen:

https://github.com/capistrano/sshkit

Nota, Capistrano 3 es bastante un cambio de Capistrano 2.x.

Cuestiones relacionadas