2010-08-10 13 views
10

Estoy usando Capistrano para manejar mi implementación, y tengo dos roles diferentes en mi configuración: web y procesamiento. Ambos tienen lo habitual: implementar tareas, pero la tarea: reiniciar debe ser diferente para los dos tipos de servidor.¿Cómo defines las mismas tareas de manera diferente para diferentes roles en Capistrano?

Así que mi primer intento fue algo como esto:

task :restart, :roles => :web do 
    run "... web related restart stuff ..." 
end 

task :restart, :roles => :processing do 
    run "... processing related restart stuff ..." 
end 

que no funciona, ya que el segundo: reinicio (para: papel de procesamiento) sustituye a la primera: reinicio (para la función: Función Web), y el: web: reinicio nunca ocurre.

Eché un vistazo rápido para ver si podía escribir código condicional dependiendo de qué rol (o roles) podría tener un servidor cuando se ejecuta la tarea, pero no hay documentación para ese tipo de cosas. ¿Algunas ideas?

Respuesta

7

Debe utilizar espacios de nombres:

namespace :web do 
    desc "Restart web servers" 
    task :restart, :roles => :web do 
    # Restart Magic Here 
    end 
end 

namespace :process do 
    desc "Restart process servers" 
    task :restart, :roles => :process do 
    # Restart magic here 
    end 
end 

# Optionally: 
task :restart do 
    web.restart 
    process.restart 
end 

Eso es lo que está buscando, creo que!

Asimismo, para utilizar estos en la línea de comandos, se utiliza

$ cap <stage>   # (if using multistage) 
$ cap web:restart  # Restarts web servers 
$ cap process:restart # Restarts process servers 
$ cap restart   # Restarts both process and web servers 

(Fuente: Soy el mantenedor de Capistrano.)

1

Debe utilizar 'paralelo' en lugar de 'correr' en este caso:

task :restart do 
    parallel do |session| 
    session.when "in?(:web)", "...substitute run command contents here...." 
    session.when "in?(:process)", "...substitute run command contents here...." 
    end 
end 

Si se va a usar algo excepto 'correr' en diferentes tareas que será mejor que se adhieren a una de las otras respuestas.

Más información sobre el comando 'paralelo' se puede encontrar aquí: https://github.com/capistrano/capistrano/wiki/2.x-DSL-Action-Invokation-Parallel

0

Si es necesario llamar a la tarea por defecto deploy, y hacer algo de reinicio de encargo, etc. me ocurrió con esta solución:

# Servers 
server "importerhost.com", :app, :web, :db, :importer, :primary => true 
server "backuphost.com", :app, :web, :db, :backup, :primary => true 
set :deploy_to, "/apps/appname" 

# Ensure deploy before restart 
before 'importer:deploy', 'deploy' 
before 'backup:deploy', 'deploy' 

# Importer 
namespace :importer do 
    desc "Restart importer service" 
    task :deploy, :roles => :importer do 
    sudo "cp #{current_release}/config/importer.conf /etc/init/importer.conf" 
    sudo "service importer restart N=1" 
    sudo "service importer restart N=2" 
    end 
end 

# Backup 
namespace :backup do 
    desc "Restart backup service" 
    task :deploy, :roles => :backup do 
    sudo "cp #{current_release}/config/backup.conf /etc/init/backup.conf" 
    sudo "service backup restart" 
    end 
end 

Y luego simplemente implemente con cap ROLES=importer importer:deploy o . Esto me dio la libertad de implementar el mismo código fuente en diferentes servidores y ejecutar tareas completamente diferentes después de la implementación real.

Cuestiones relacionadas