Verwalten Sie Kochbücher in einer Teamumgebung

13

Ich lerne Koch und habe Probleme, alles so zu strukturieren, dass ich mit meinem Team arbeiten kann.

Zunächst sollten Sie einen Chef-Repo-Ordner erstellen, in dem Sie die zur Verwaltung Ihrer Knoten verwendeten Kochbücher speichern und ändern.

Ich arbeite an verschiedenen Projekten, und jedes von ihnen ist bereits unter Git-Quellcodeverwaltung. Idealerweise würde ich einen Chef-Repo-Ordner in jedem meiner Projekte mit diesen Kochbüchern führen, oder?

Im Chef-Repo-Ordner muss ich jedoch einen Konfigurationsordner (.chef) mit meiner Messerkonfiguration und meinen Schlüsselvalidierungen hinzufügen, die für mich spezifisch sind. Ist es normal, den .chef-Ordner einfach der gitignore-Datei hinzuzufügen?

Ich verstehe, dass die Kochbücher auf den Chef-Server hochgeladen und dort bereitgestellt werden. Wie trennen andere Teams die Bereitstellung von Produktionsumgebungen, ohne viel Arbeit zu duplizieren? Wir haben eine Hauptniederlassung, die unsere Produktionsniederlassung ist, eine Entwicklerniederlassung, die unsere Bereitstellungsniederlassung ist (weniger als 5% der Anfragen der Website werden entgegengenommen) und Feature-Niederlassungen. In den meisten Fällen wird der Entwicklungszweig, wenn er stabil ist, mit dem Hauptzweig zusammengeführt. Wie können wir die Kochbücher separat hochladen, um zwei Umgebungen auf unterschiedliche Weise zu haben?

Danke für die Hilfe!

Alex Recarey
quelle
Könnten Sie den .chefOrdner für die Verwendung von Umgebungsvariablen oder Ähnlichem einrichten ?
Ceejayoz
Könnten Sie bitte Ihr Ziel genauer beschreiben? Welche Art von Infrastruktur möchten Sie mit Chef automatisieren? Sie haben verschiedene Branchen erwähnt. Wenn Sie über die Bereitstellung von Software sprechen, ist ein CI-Tool wie Jenkins möglicherweise die bessere Lösung.
Geewiz
Es ist so gut, wie Puppet solche Umgebungen von Haus aus unterstützt.
Tom O'Connor

Antworten:

15

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 ~/.chefverwende ich das Unterverzeichnis '.chef' in chef-repo, das nicht in git gespeichert ist (es wird hinzugefügt .gitignore). Ich habe auch Datei- config/knife.rbDatei, 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.rbgeladen, 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.rbdie 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 sshdie 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.gzDatei, 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 initAufgabe, die ein .chefVerzeichnis erstellt , Symlinks config/knife.rbdort, entschlüsselt und entschlüsseltchef-secrets.tgz Datei Datei , dass der private Opscode Platform-Schlüssel des Benutzers da ist und .chef/knife-local.rbrichtig 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.

Maciej Pasternacki
quelle
Danke für die ausführliche Antwort. Wenn ich mir die Arbeit
anschaue, die
3

Sie müssen zwei Chef-Server einrichten, einen für die Produktion und einen für die Entwicklung. Der Grund dafür ist, dass kein einzelner Chef-Server die verzweigte Entwicklung unterstützen kann. auch mit Umgebungen.

Oder Sie können das Chef-Server-Konzept aufgeben und chef-solo verwenden. Sie können Ihre Kochbücher in Git verwalten. Sie können verzweigen und zusammenführen. Sie können die Probleme mit Messeranmeldeinformationen ignorieren, da Sie sie nicht mehr verwenden.

Messersuche oder Datentaschen können nicht verwendet werden **. Aber manche Leute brauchen diese Funktionen sowieso nicht.

** Nun, Sie können: http://wiki.opscode.com/display/chef/Data+Bags#DataBags-UsingDataBagswithChefSolo

kgilpin
quelle
2

Ich habe zwei Verzeichnisse in meinem Haus, .chef und Chef-Repo. Der Chef-Repo ist in Git. Das .chef ist ein privates Verzeichnis, das als Standard für knife verwendet wird. Sie müssen Ihre Geheimnisse von .chef nicht in git legen; Messer sucht nach ~ / .chef.

cjc
quelle
2

Dein ~ / .chef Verzeichnis sollte nicht im Git Repo sein.

Ich habe ein ~ / projects / -Verzeichnis, in dem ich mein Chef-Repo verwalte. Darin geht die Konfiguration meiner Server.

Mein letzter Job war als Systemingenieur bei Ruby-on-Rails. Unsere Nginx-, Lack- und Rails-Konfigurationen (unter anderem) sind im Chef-Repo enthalten, aber die Rails-Apps selbst wurden in separaten Git-Repos gespeichert und separat bereitgestellt.

Unsere Staging-Umgebung war ein einzelner Server, auf dem die gesamte Staging-Umgebung ausgeführt wurde. Dies war nicht ideal, da es nicht der Produktion ähnelte, in der Rails Thins und die DB auf separaten Kisten standen. Was ich empfehlen würde, ist die Verwendung von Chef's Environments, um Inszenierung und Produktion zu trennen. (So ​​war es, als ich dort ankam, und ich habe einfach nicht die Zeit, das zu reparieren, bevor ich ging.)

gWaldo
quelle