2009-04-15 17 views

Odpowiedz

18

Standardowy sposób zrobić to w Capistrano:

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 

Więc tak, trzeba zrobić, aby napisać osobne zadania, ale można do nich dzwonić za zadanie dominującej i będą filtrować odpowiednio.

+3

To nie zadziałało, wszystkie trzy zadania zostały wykonane. – aceofspades

+3

Nie działa również dla mnie. Wszystkie zadania zostaną wykonane. –

+2

Tutaj również nie działa – Fluffy

5

Właściwie nie:

% 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 

: role param jest przekazywany dalej do uruchomienia polecenia itp ale nie wydaje się wpływać, czy zadanie jest rzeczywiście zwolniony.

Niestety, nie znalazłem sposobu na skomentowanie komentarza, więc napisałem go tutaj.

1

Istnieje sposób, rodzaj. Sprawdź: http://weblog.rubyonrails.org/2006/8/30/capistrano-1-1-9-beta/, a zobaczysz, że możesz zastąpić domyślne role przy użyciu zmiennej środowiskowej ROLES.

Mam zadanie zdefiniowane jako:

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

:test rola jest przypisana do jednego serwera.

w linii poleceń, można uruchomić:

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

a zadanie będzie teraz pracować na roli lots_of_servers.

Nie sprawdziłem, czy działa to w skrypcie ruby, aktualizując skrót mieszania ENV, ale jest to dobry początek.

3

Można również zrobić

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

Tylko dla rekordu, to może być rozwiązaniem wykorzystującym Capistrano 3:

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 

Definicja Sever do wykonywania „do_something” zadanie w serwerze aplikacji byłoby coś jak:

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

Następnie można wywołać zadanie (istnieje kilka sposobów, aby to zrobić) i zadanie zostanie wykonaj konkretne instrukcje zgodnie z "app_role".

Powiązane problemy