Frage

Ich habe ein System in der Produktion, die mehrere Server in mehreren Rollen hat. Ich mag einen neuen App-Server testen, indem Sie auf diesen speziellen Server bereitstellen, ohne auf jeden Server in der Produktion erneut zu implementieren. Gibt es eine Möglichkeit Capistrano zu bitten, zu einem bestimmten Server zu implementieren? Im Idealfall würde Ich mag etwas zu können, wie laufen

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

, wenn ich will nur app2.example.com einzusetzen.

Danke!

[Update] Ich habe versucht, die Lösung von wulong vorgeschlagen durch Ausführen:

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

aber Capistrano schien versucht werden, um Aufgaben auszuführen, für andere Rollen auf dem Server zusätzlich zu App Aufgaben. Vielleicht muss ich meine Version der Kappe aktualisieren (ich bin mit v2.2.0)?

War es hilfreich?

Lösung

ich am Ende eine Frage nach der Capistrano Benutzerliste veröffentlichen hier und bekam folgende Antwort von Jamis (ein bisschen von mir hier aus Gründen der Übersichtlichkeit bearbeitet):


Versuchen Sie die HOSTS-Umgebungsvariable:

cap HOSTS=app2.example.com production deploy

Beachten Sie, dass dies zu tun wird behandeln app2 wie in jeder Rolle zu sein, nicht nur je nachdem, welche Rolle (n) kommt es in deklariert werden.

Wenn das, was Sie wollen, ist eine regelmäßige deploy zu tun, sondern nur auf app2 handeln und nur als app2 in Ihrem Rezept-Datei deklariert wird, können Sie die HOSTFILTER verwenden Variable statt:

cap HOSTFILTER=app2.example.com production deploy 

[...]

Betrachten Sie dieses konkrete Beispiel. Angenommen, Sie Skript definiert drei Server, A, B und C. Und es definiert eine Aufgabe, "foo", dass (standardmäßig) will sich auf A und B, aber nicht C. Wie dies auszuführen:

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

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

Wenn Sie nun cap foo tun, wird es den Befehl echo sowohl A und B ausgeführt werden.

Wenn Sie cap HOSTS=C foo tun, wird es den Befehl echo auf C laufen, unabhängig von den: Rollen Parameter für die Aufgabe

.

Wenn Sie cap HOSTFILTER=C foo tun, wird es nicht das Echo Befehl ausführen zu alle, weil die Kreuzung von (A B) und (C) eine leere Menge ist. (Dort sind keine Hosts in Hostliste des foo, die C entsprechen.)

Wenn Sie cap HOSTFILTER=A foo tun, wird es den Echo-Befehl auf nur laufen A, weil (A B) durchschnitten mit (A) (A).

Schließlich, wenn Sie cap HOSTFILTER=A,B,C foo tun, wird es das Echo läuft Befehl auf A und B (aber nicht C), da (A B) mit durchschnitten (A B C) (A B).

Um es zusammenzufassen: HOSTS überschreibt vollständig die Hosts oder Rollen Erklärung die Aufgabe alles, und Kräfte gegen den angegebenen Host (s) laufen. Die HOSTFILTER, auf der anderen Seite, filtert einfach die vorhandenen Hosts gegen die gegebene Liste, nur den Server auswählen, die bereits in die Aufgaben Serverliste.

Andere Tipps

Die folgende Beschreibung ist aus dem Kasten heraus arbeiten:

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

Wenn Sie auf> 1 Server mit der gleichen Rolle zu implementieren:

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

Ich habe ähnliches Problem und versucht, die folgenden. Es funktioniert:

cap production ROLES=web HOSTS=machine1 stats

Es soll möglich sein, so etwas wie dies in deploy.rb zu tun:

task :production do
  if ENV['SERVER'] && ENV['ROLE']
    role ENV['ROLE'], ENV['SERVER']
  else
    # your full config
  end
end

Sie können auch task-Ebene Hosts Parameter auf diese Weise angeben:

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

end 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top