Ich arbeite mit mehreren Projekten, sodass die Lösung von cjc für mich nicht funktioniert. Es gibt auch ein Problem mit der gemeinsamen oder der benutzerdefinierten Konfiguration (Adressen usw. sind im Unternehmen üblich, es steckt auch ein bisschen Magie in den Konfigurationen). Das Schema, auf das ich mich schließlich festgelegt habe, ist ein bisschen hacken, aber es ist bequem zu bedienen.
Anstelle von global ~/.chef
verwende ich das Unterverzeichnis '.chef' in chef-repo, das nicht in git gespeichert ist (es wird hinzugefügt .gitignore
). Ich habe auch Datei- config/knife.rb
Datei, die in Git eingecheckt ist und gemeinsame Konfiguration enthält. Es beginnt mit diesem Schnipsel:
root_dir = File.join(File.dirname(__FILE__), '..')
%w(knife-secrets.rb knife-local.rb).each do |conf_name|
conf = File.join(root_dir, ".chef", conf_name)
Kernel::load(conf) if File.exists? conf
end
Hiermit werden Dateien .chef/knife-local.rb
geladen, die eine benutzerdefinierte Konfiguration enthalten (in der Basisversion ist es nur eine OPSCODE_USER='username'
Konstante, die später verwendet wird, aber jede Messerkonfiguration enthalten kann) und .chef/knife-secrets.rb
die gemeinsame Geheimnisse (AWS-Schlüssel usw.) enthält.
Darunter gibt es eine reguläre Messerkonfiguration, die Konstanten verwendet, die in diesen Dateien definiert sind, zB:
client_key "#{root_dir}/.chef/#{OPSCODE_USER}.pem"
Auf diese Weise erreiche ich eine unternehmensweite Standardisierung der Messerkonfiguration, was wiederum bedeutet, dass jeder Code-Snippet oder Messeraufruf, der in einem Wiki geteilt wird, für alle funktioniert. Es gibt genug Verwirrung und Magie im Messer selbst - verschiedene Konfigurationen würden es nur noch schlimmer machen. Außerdem kann jeder von kleinen magischen Ausschnitten wie diesem profitieren , um knife ssh
die im Benutzer konfigurierte Anmeldung zu verwenden~/.ssh/config
Es gibt auch Probleme mit gemeinsamen Geheimnissen: Validierungsschlüssel des Chef-Servers, AWS-Schlüssel, die in gespeichert sind knife-secrets.rb
, den privaten SSH-Schlüssel von EC2, verschlüsselte Datenbeuteltasten und so weiter. Wir möchten auf keinen Fall, dass sie im Repository gespeichert werden - oder tatsächlich an einem Ort, an dem sie nicht sicher verschlüsselt sind. Deshalb verteilen wir diese Dateien als eine .tar.gz
Datei, die für alle im Unternehmen mit GPG verschlüsselt und über Dropbox freigegeben ist.
Das alles zu konfigurieren wird immer komplizierter und ich möchte, dass die Leute im Team das Ding tatsächlich benutzen, also gibt es das letzte Element: rake init
Aufgabe, die ein .chef
Verzeichnis erstellt , Symlinks config/knife.rb
dort, entschlüsselt und entschlüsseltchef-secrets.tgz
Datei Datei , dass der private Opscode Platform-Schlüssel des Benutzers da ist und .chef/knife-local.rb
richtig ist konfiguriert, verknüpft Messer-Plugins und legt die richtigen Berechtigungen für das Verzeichnis und die darin enthaltenen Dateien fest. Diese Aufgabe ist so eingerichtet, dass sie auf einem bereits initialisierten Repository sicher viele Male ausgeführt werden kann (z. B. um Geheimnisse oder Messer-Plugins zu aktualisieren).
Es gibt auch eine Hilfsaufgabe, die alle Geheimnisse neu packt, den Tarball für alle verschlüsselt und in die Dropbox kopiert, um das Hinzufügen neuer Mitarbeiter oder das Ändern von Geheimnissen zu vereinfachen.
In Bezug auf mehrere Umgebungen: Chef hat eine Funktion namens Umgebungen . Ich habe es noch nicht benutzt, aber es sollte tun, was Sie brauchen. Sie können die Produktionsumgebung auch streng voneinander trennen (um zu vermeiden, dass Entwickler Schlüssel haben, die sich auf die Produktionsumgebung beziehen), indem Sie zwei separate Hosted Chef-Organisationen oder Chef-Server verwenden. Dieses knife.rb-Snippet zeigt, wie man knife basierend auf dem aktuell ausgecheckten Zweig auf eine andere Art und Weise konfiguriert. Hiermit können Sie die Umgebung und die URL des Chef-Servers festlegen. Es gibt auch ein Messer-Plugin namens Messer-Fluss , das einen vollständigeren Workflow mit zwei Organisationen bietet.
.chef
Ordner für die Verwendung von Umgebungsvariablen oder Ähnlichem einrichten ?