2010-11-05 14 views
16

Używam Capistrano do zarządzania aplikacją WWW Java działającą na kilku serwerach równoważących obciążenie. Niektóre zadania (takie jak zmiany w konfiguracji) wymagają ponownego uruchomienia serwera lub ponownego wdrożenia aplikacji, podczas której serwer przestaje odpowiadać.Czy Capistrano może wykonywać zadania na hostach kolejno?

Gdyby Capistrano mógł wykonywać te zadania na serwerach kolejno, w porównaniu z jednoczesnym uruchomieniem, tylko jedna maszyna w farmie spadałaby na raz, a system równoważenia obciążenia zapewniałby, że żadne żądania nie zostaną utracone. Jednak z tego co wiem, Capistrano wykonuje jednocześnie operacje na serwerach.

Aby było jasne, nie próbuję wykonywać kolejno różnych zadań. Próbuję wykonać to samo zadanie na różnych serwerach kolejno.

Mogę wymyślić kilka sposobów na hakowanie tego w mojej konfiguracji, ale wygląda na to, że powinna być flaga, którą mogę gdzieś ustawić.

Ktoś wie jak to zrobić?

Odpowiedz

19

Używam tego ponownie uruchomić serwery szeregowo zamiast równolegle:

task :my_task, :roles => :web do 
    find_servers_for_task(current_task).each do |server| 
    run "[task command here]", :hosts => server.host 
    end 
end 
+0

To działało idealnie. Dziękuję Ci. – devinfoley

+0

Wielkie dzięki! Działa idealnie. – raskhadafi

+2

niesamowite! btw, może cap powinien dodawać strategię do wykonania zadania w sekwencji. – DiveInto

-1

Cześć, nie da się łatwo w kapistanie, oczywiście można podejść.

1) można określić każdy serwer w innej roli i dodać oddzielne zadanie odpowiedzialne za rotację ról i wywoływanie zadania, które faktycznie wymaga zadania.

2) można napisać osobny skrypt robi obrót, jak wyżej, ale stosując różne nazwy hosta zamiast ról

3) Jest również możliwe, aby filtrować hostów/serwery w Kapistrana wykorzystujące zmienną środowiskową, może można go używać w w algorytmie rotacyjnym.

Niestety nie ma dobrej dokumentacji dla Capistrano dla mnie czytanie źródeł Capistrano działało całkiem dobrze, ale to również zajmuje dużo czasu.

+0

Dzięki za info.Nie odpowiedź, na którą liczyłem, ale prawda jest bolesna. Mogę spróbować rozwidlić i dodać tę funkcję. – devinfoley

16

Można ustawić :max_hosts za zadanie ograniczyć swoją równoległość:

:max_hosts - określa maksymalną liczbę hostów, które powinny być wybrane na raz. Jeśli ta wartość jest mniejsza niż liczba hostów wybranych do uruchomienia, hosty będą uruchamiane w grupach max_hostów. Wartością domyślną jest zero, co oznacza, że ​​nie ma maksymalnego limitu hosta. Należy pamiętać, że nie ogranicza to liczby kanałów SSH, które można otworzyć, tylko liczbę hostów, na których zostanie wywołana.

przykład:

desc "Say hello, one at a time" 
task :hello, :roles => :app, :max_hosts => 1 do 
    run "echo serial hello ; sleep 0 ; echo serial hello DONE" 
    # Note that task parameters do NOT get automatically passed on to 
    # other tasks, i.e. a call to "deploy:restart" would be 
    # unaffected by :max_hosts set here. Example: 
    self.send(:normal_hello) 
end 

desc "Say hello, everybody" 
task :normal_hello, :roles => :app do 
    run "echo 'normal (parallel) hello' ; sleep 10 ; echo normal hello DONE" 
end 
4

Capistrano 3 wykorzystuje SSHKit które gwarantują sekwencyjne przesyłanie polecenia do wielu serwerów. Jest to przykład na SSHKit mnie czytać:

https://github.com/capistrano/sshkit

Uwaga, Capistrano 3 jest zupełnie zmiana od Capistrano 2.x.

Powiązane problemy