5

Tenemos 2 instancias detrás de un equilibrador de carga que ejecuta la misma aplicación de rieles con el pasajero. Cuando implementamos, el tiempo de inicio del servidor hace que las solicitudes expiren. Como resultado, tenemos una secuencia de comandos que actualiza cada servidor web individualmente al quitar uno de los LB, implementarlo con límite, probar una carga de página dinámica y volver a colocarlo en el LB.¿Cómo se hace un despliegue rodante con capistrano?

¿Cómo podemos hacer que capistrano haga esto por nosotros con un solo comando? Pude configurarlo para que se implemente en todas las instancias simultáneamente, pero todas se reinician al mismo tiempo y hacen que el sitio no esté disponible durante 20 segundos.

¿Qué me falta aquí? Parece que esto debería ser un patrón común.

+0

¿Puede agregar más detalles en la nota "todos se reinician al mismo tiempo"? ¿Qué quieres decir exactamente aquí? –

Respuesta

0

No es tan fácil serializar la implementación en capistrano, a la que le gusta paralelizar todas sus operaciones entre servidores. Para volver a plantear el problema, parece que tiene un puñado de servidores y desea desconectarlos en secuencia para actualizar la implementación.

El truco es para anular la tarea deploy:create_symlink en su configuración de implementación:

def perform_task_offline options 
    sudo "take_this_server_offline", options 
    yield 
    sudo "put_this_server_online", options 
end 

def create_symlink_task options 
    # does what your existing deploy:create_symlink did, something like: 
    run "rm -f /web/current && ln -s #{release_path} /web/current", options 
end 

namespace :deploy do 

    task :create_symlink, {once: true, except: {no_release: true}} do 
    deployed_servers = Array.new 

    roles[:app].servers.each do |current_server| 
     options = {hosts: current_server} 
     deployed_servers.push current_server 
     perform_task_offline(options) { create_symlink_task options } 
    end 
    end 
end 

En este caso perform_task_offline incluye comandos que se ejecutan en el servidor especificado en options que eliminan desde el equilibrador de carga, mientras que yield s del bloque incluido create_symlink_task, que crea el enlace simbólico de implementación.

Debería poder ejecutar el comando estándar cap para implementar, y verá que los servidores se desconectan secuencialmente, crean el enlace simbólico "actual" y vuelven a aparecer.

Tenga en cuenta que el código anterior realiza un seguimiento de los servidores que se han implementado con éxito con deployed_servers. Si desea poder retrotraer una implementación fallada activa (es decir, la falla ocurre durante el despliegue mismo) en solo los servidores que se habían desplegado anteriormente, necesitará un bucle similar dentro de un bloque on_rollback do, pero solo en el deployed_servers.

Cuestiones relacionadas