2010-08-10 6 views
10

Ich verwende Capistrano, um meine Bereitstellung zu verwalten, und ich habe zwei verschiedene Rollen in meinem Setup -: Web und: Verarbeitung. Beide haben die üblichen Aufgaben: deploy tasks, aber der Task: restart muss für die beiden Servertypen unterschiedlich sein.Wie definieren Sie die gleichen Aufgaben für verschiedene Rollen in Capistrano?

So war mein erster Versuch, etwas wie folgt aus:

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

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

Was nicht funktioniert, weil die zweite: Neustart (für: Verarbeitung von Rolle) ersetzt die erste: Neustart (für die: Webrolle), und das: web: neustart passiert nie.

Ich habe mich kurz umgesehen, um zu sehen, ob ich bedingten Code schreiben könnte, abhängig von der Rolle (oder den Rollen) eines Servers, wenn die Aufgabe ausgeführt wird, aber es gibt keine Dokumentation für so etwas. Irgendwelche Ideen?

Antwort

7

sollten Sie Namespaces verwenden:

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 

Das ist, was Sie suchen Ich denke!

auch zu verwenden, um diese auf der Kommandozeile, würden Sie

$ 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 

(Quelle: ich Capistrano Betreuer bin.) Verwenden

1

Sie sollten 'parallel' anstelle von 'run' verwenden in diesem Fall:

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 

Wenn Sie etwas zu verwenden, außer ‚run‘ in verschiedenen Aufgaben gehen Sie besser auf eine der anderen Antworten bleiben.

Mehr Informationen zu ‚parallel‘ Befehl kann hier gefunden werden: https://github.com/capistrano/capistrano/wiki/2.x-DSL-Action-Invokation-Parallel

0

Wenn Sie die Standard deploy Aufgabe aufrufen müssen, und einige benutzerdefinierte Neustarten tun, usw. ich mit dieser Lösung kam:

# 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 

Und dann einfach mit cap ROLES=importer importer:deploy oder bereitstellen. Dies gab mir die Freiheit, den gleichen Quellcode auf verschiedenen Servern bereitzustellen und nach der eigentlichen Bereitstellung völlig andere Aufgaben auszuführen.

Verwandte Themen