2009-04-15 4 views

Antwort

18

Die Standard-Weg, dies in Capistrano zu tun:

task :whatever, :roles => [:x, :y, :z] do 
    x_tasks 
    y_tasks 
    z_tasks 
end 

task :x_tasks, :roles => :x do 
    #... 
end 

task :y_tasks, :roles => :y do 
    #... 
end 

task :z_tasks, :roles => :z do 
    #... 
end 

Also ja, Sie getrennte Aufgaben schreiben müssen, aber man kann sie von einer übergeordneten Aufgabe nennen, und sie werden in geeigneter Weise filtern.

+3

Dies hat bei mir nicht funktioniert, alle drei Aufgaben werden ausgeführt. – aceofspades

+3

Hat auch nicht für mich gearbeitet. Alle Aufgaben werden ausgeführt. –

+2

Funktioniert hier auch nicht – Fluffy

5

Eigentlich nicht:

% cat capfile 
server 'localhost', :role2 
task :task1, :roles=>:role1 do 
    puts 'task1' 
end 
task :task2 do 
    task1 
end 

% cap task2 
    * executing `task2' 
    * executing `task1' 
task1 

Die: Rollen param weiter geleitet wird, Befehl usw. zu laufen, aber scheint nicht zu beeinflussen, ob die Aufgabe tatsächlich ausgelöst wird.

Entschuldigung, habe nicht den Weg gefunden, einen Kommentar zu kommentieren, also habe ich es hier geschrieben.

1

Es gibt einen Weg, irgendwie. Überprüfen Sie: http://weblog.rubyonrails.org/2006/8/30/capistrano-1-1-9-beta/ und Sie werden sehen, dass Sie die Standardrollen mithilfe der Umgebungsvariablen ROLES überschreiben können.

Ich habe eine Aufgabe wie folgt definiert:

desc "A simple test to show we can ssh into all servers" 
task :echo_hello, :roles => :test do 
    run "echo 'hello, world!'" 
end 

Die :test Rolle zu einem Server zugewiesen wird.

Auf der Kommandozeile kann ich laufen:

[[email protected] bin]$ cap echo_hello ROLES=lots_of_servers 

Und wird die Aufgabe nun auf der lots_of_servers Rolle laufen.

Ich habe nicht verifiziert, dass dies in einem Ruby-Skript funktioniert, indem Sie den ENV Hash aktualisieren, aber das ist ein guter Anfang.

3

können Sie auch

task :foo do 
    run "command", :roles => :some_role 
    upload "source", "destination", :roles => :another_role 
end 
1

Nur für das Protokoll, das könnte eine Lösung mit Capistrano 3 sein:

desc "Do something specific for 3 different servers with 3 different roles" 
task :do_something do 
    on roles(:api_role), in: :sequence do 
    # do something in api server 
    end 

    on roles(:app_role), in: :sequence do 
    # do something in application server 
    end 

    on roles(:another_role), in: :sequence do 
    # do something in another server 
    end 
end 

Sever Definition „do_something“ Aufgabe in einem Anwendungsserver wäre ausführen etwas wie:

server 'application.your.domain', user: 'deploy', roles: %w{app_role} 

Dann können Sie die Aufgabe aufrufen (es gibt mehrere Möglichkeiten, es zu tun) und die Aufgabe wird Führe bestimmte Anweisungen gemäß der "app_role" aus.

Verwandte Themen