Jak wdrożyć na jednym konkretnym serwerze przy użyciu Capistrano

Mam system w produkcji, który ma kilka serwerów w kilku rolach. Chciałbym przetestować nowy serwer aplikacji, wdrażając go na tym konkretnym serwerze, bez konieczności ponownego rozmieszczania na każdym serwerze produkcyjnym. Czy istnieje sposób, aby poprosić Capistrano, aby wdrożyć na określonym serwerze? Idealnie chciałbym móc uruchomić coś takiego jak

cap SERVER=app2.example.com ROLE=app production deploy

Gdybym tylko chciał wdrożyć do app2.example.com.

Dzięki!

[update] Wypróbowałem rozwiązanie zaproponowane przez wulonga przez wykonanie:

cap HOSTS=app2.server.hostname ROLE=app qa deploy 

Ale capistrano wydawał się próbować wykonywać zadania dla innych ról na tym serwerze oprócz zadań aplikacji. Może muszę zaktualizować moją wersję cap (używam v2.2.0)?

Author: Benjamin, 2009-01-10

5 answers

W końcu zamieściłem pytanie na liście użytkowników capistrano tutaj i otrzymałem następującą odpowiedź od Jamisa (edytowany trochę przeze mnie tutaj dla jasności):


Wypróbuj zmienną środowiskową HOSTS:

cap HOSTS=app2.example.com production deploy

Zauważ, że w ten sposób app2 będzie traktowany jako pełniący każdą rolę, a nie tylko bez względu na to, w jakiej roli (- ach) zostanie zadeklarowana.

Jeśli chcesz zrobić regularne wdrożenie, ale działaj tylko na app2, i tylko jak app2 jest zadeklarowana w pliku receptury, można użyć HOSTFILTER zmienna zamiast:

cap HOSTFILTER=app2.example.com production deploy 

[...]

Rozważ ten konkretny przykład. Załóżmy, że Twój skrypt definiuje trzy serwery, A, B i C. i definiuje zadanie, " foo", to (domyślnie) chce działać na A i B, ale nie NA C. W ten sposób:

role :app, "A", "B"
role :web, "C"

task :foo, :roles => :app do
  run "echo hello"
end

Teraz, jeśli to zrobisz cap foo, uruchomi polecenie echo zarówno na A jak I B.

Jeśli wykonasz cap HOSTS=C foo, uruchomi polecenie echo Na C, niezależnie od parametru: roles do zadania.

Jeśli to zrobisz cap HOSTFILTER=C foo, nie będzie działać Komenda echo w wszystkie, ponieważ przecięcie (A B) I (C) jest zbiorem pustym. (Tam nie ma hostów na liście hostów foo, które pasowałyby do C.)

Jeśli wykonasz cap HOSTFILTER=A foo, uruchomi polecenie echo tylko na A, ponieważ (A B) przecinane przez (a) jest (a).

Wreszcie, jeśli to zrobisz cap HOSTFILTER=A,B,C foo, uruchomi echo polecenie na A i B (ale nie C), ponieważ (A B) przecinają się z (A B C) jest (A B).

Podsumowując: hosty całkowicie nadpisują deklarację hostów lub ról zadania i siły wszystko, aby uruchomić z podanymi hostami. Z drugiej strony, HOSTFILTER po prostu filtruje istniejące hosty na podaną listę, wybierając tylko te serwery, które są już w Lista zadań serwera.

 124
Author: Pete Hodgson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-05 15:55:36

Po wyjęciu z pudełka powinny działać:

cap HOSTS=app2.example.com ROLE=app deploy

Jeśli chcesz wdrożyć do > 1 serwera o tej samej roli:

cap HOSTS=app2.example.com,app3.example.com,app4.example.com ROLE=app deploy
 3
Author: wulong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-11 00:49:46

Mam podobny problem i wypróbowałem następujące. Działa:

cap production ROLES=web HOSTS=machine1 stats
 2
Author: Xian Xu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-30 12:36:19

Powinieneś być w stanie zrobić coś takiego w deploy.rb:

task :production do
  if ENV['SERVER'] && ENV['ROLE']
    role ENV['ROLE'], ENV['SERVER']
  else
    # your full config
  end
end
 1
Author: Dave Pirotte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-10 05:06:32

Możesz również określić parametr hostów na poziomie zadania w ten sposób:

task :ship_artifacts, :hosts => ENV['DEST_HOST']  do

end 
 0
Author: jeffreyveon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-11 07:53:37