61 Stimmen

Wie man mit Capistrano auf einen bestimmten Server bereitstellt

Ich habe ein System in Produktion, das mehrere Server in verschiedenen Rollen hat. Ich möchte einen neuen App-Server testen, indem ich auf diesen spezifischen Server deploye, ohne auf jeden Server in der Produktion neu deployen zu müssen. Gibt es eine Möglichkeit, Capistrano zu bitten, auf einen bestimmten Server zu deployen? Idealerweise würde ich gerne etwas wie ausführen können

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

wenn ich nur auf app2.example.com deployen möchte.

Danke!

[update] Ich habe die von wulong vorgeschlagene Lösung ausprobiert, indem ich ausgeführt habe:

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

aber capistrano schien zu versuchen, Aufgaben für andere Rollen auf diesem Server zusätzlich zu den App-Aufgaben auszuführen. Vielleicht muss ich meine Version von Cap aktualisieren (ich verwende v2.2.0)?

130voto

Pete Hodgson Punkte 15076

Ich habe eine Frage an die Capistrano-Benutzerliste hier gepostet und folgende Antwort von Jamis (hier etwas bearbeitet für Klarheit) erhalten:


Probieren Sie die HOSTS-Umgebungsvariable aus:

cap HOSTS=app2.example.com production deploy

Beachten Sie, dass dadurch app2 als Teil jeder Rolle behandelt wird, nicht nur in den Rolle(n), in denen es deklariert ist.

Wenn Sie einfach ein reguläres Deployment durchführen möchten, aber nur mit app2 arbeiten und nur so, wie es in Ihrer Rezeptdatei deklariert ist, können Sie stattdessen die HOSTFILTER-Variable verwenden:

cap HOSTFILTER=app2.example.com production deploy 

[...]

Betrachten Sie dieses konkrete Beispiel. Angenommen Ihr Skript definiert drei Server: A, B und C. Und es definiert eine Aufgabe "foo", die (standardmäßig) auf A und B, aber nicht auf C, ausgeführt werden soll. So ähnlich:

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

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

Wenn Sie jetzt cap foo ausführen, wird der echo-Befehl auf sowohl A als auch B ausgeführt.

Wenn Sie cap HOSTS=C foo ausführen, wird der echo-Befehl auf C ausgeführt, unabhängig von den :roles-Parametern der Aufgabe.

Wenn Sie cap HOSTFILTER=C foo ausführen, wird der echo-Befehl gar nicht ausgeführt, da der Schnitt von (A B) und (C) eine leere Menge ist. (Es gibt keine Hosts in der Hostliste von foo, die mit C übereinstimmen.)

Wenn Sie cap HOSTFILTER=A foo ausführen, wird der echo-Befehl nur auf A ausgeführt, da (A B) geschnitten mit (A) (A) ergibt.

Zu guter Letzt, wenn Sie cap HOSTFILTER=A,B,C foo ausführen, wird der echo-Befehl auf A und B (aber nicht C) ausgeführt, da (A B) geschnitten mit (A B C) (A B) ergibt.

Zusammenfassend: HOSTS überdeckt vollständig die Hosts- oder Rollendeklaration der Aufgabe und zwingt alles, gegen den angegebenen Host(s) ausgeführt zu werden. Der HOSTFILTER filtert hingegen einfach die vorhandenen Hosts gegen die gegebene Liste, indem nur die Server ausgewählt werden, die bereits in der Hostliste der Aufgaben enthalten sind.

1 Stimmen

Sieht so aus, als würde das nicht mehr mit Capistrano 3.4 funktionieren.

0 Stimmen

In Capistrano 3 verwenden Sie die HOSTS-Umgebungsvariable für das, was in Capistrano 2 HOSTFILTER ist. capistranorb.com/documentation/advanced-features/host-filter‌​ing

3voto

wulong Punkte 2617

Das folgende sollte von Anfang an funktionieren:

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

Wenn Sie auf mehr als einem Server mit der gleichen Rolle bereitstellen möchten:

cap HOSTS=app2.example.com,app3.example.com,app4.example.com ROLE=app deploy

1 Stimmen

Ich habe den ersten Fall (Bereitstellung auf einem einzelnen App-Server) ausprobiert, indem ich cap HOSTS=app2.server.hostname ROLE=app qa deploy ausgeführt habe, aber Capistrano schien versucht zu haben, Aufgaben für andere Rollen auf diesem Server zusätzlich zu App-Aufgaben auszuführen. Vielleicht muss ich meine Version von Cap aktualisieren (ich benutze 2.2.0).

0 Stimmen

HOSTFILTER ist die Antwort, das ist nicht das, was du willst.

2voto

Xian Xu Punkte 266

Ich habe ein ähnliches Problem und habe folgendes versucht. Es funktioniert:

cap production ROLES=web HOSTS=machine1 stats

1voto

Dave Pirotte Punkte 3786

Sie sollten in der Lage sein, etwas Ähnliches wie folgt in deploy.rb zu tun:

task :production do
  if ENV['SERVER'] && ENV['ROLE']
    role ENV['ROLE'], ENV['SERVER']
  else
    # Ihre vollständige Konfiguration
  end

0voto

jeffreyveon Punkte 13382

Sie können auch den Task-Level-Hosts-Parameter auf diese Weise spezifizieren:

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

end

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X