Verwenden Sie git für mehrere Serverkonfigurationsdateien

14

Wir haben viel Quellcode auf git migriert und sind sehr zufrieden mit unserer aktuellen Lösung. Wir möchten, dass unsere Serverkonfigurationsdateien auf demselben System versioniert werden, aber es gibt einige Dinge, die nicht so funktionieren, wie wir es gerne hätten, und ich hoffe, dass jemand seine Erfahrungen hier mitteilen kann.

Diese Frage ähnelt der Verwendung der Versionskontrolle für Serverkonfigurationsdateien. , aber wir haben einige spezielle Anforderungen, die mit den Vorschlägen zu dieser Frage nicht funktionieren.

Das aktuelle Setup verwendet Subversion für Konfigurationsdateien. Das entsprechende Repository sieht ungefähr so ​​aus

 / # Wurzel des Repositorys
 + - www.domain.com/ # Konfiguration für www
 | \--etc/
 | \ - apache2 /
 + - dev.domain.com/ # configuration for dev
 | + - etc /
 | \ - opt /
 | \ - app1 /         
 | \ - conf / # configuration for app1 on dev
 \ - staging.domain.com/ # Konfiguration für die Bereitstellung

Mit Subversion würde dies gut funktionieren, da es möglich ist, nur ein Unterverzeichnis eines Repositorys auszuchecken. Darüber hinaus können Sie svn: externals verwenden, um auf eine gemeinsame Struktur für mehrere verschiedene Konfigurations-Setups zu verweisen. Wir mussten uns nur mit den .svn- Dateien in allen versionierten Verzeichnissen befassen . Git hingegen hat kein SVN: Externe und spärliche Auscheckvorgänge erfordern immer den gleichen Pfad vom Stammverzeichnis zum eigentlichen Verzeichnis.

Bei der Erörterung der Migration zu Git habe ich versucht, die wichtigsten Anforderungen für die Versionierung der Serverkonfiguration aufzuschreiben :

  • Wir wollen nur ein einziges Repository
  • Änderungen sollten einfach auf die Zentralfernbedienung übertragen werden können
  • Änderungssätze sollten den tatsächlichen Autor enthalten

Gibt es eine gute Möglichkeit, die gesamte Konfiguration in einem Repository zu haben und nur einen Unterpfad als Arbeitskopie zu haben? Derzeit überlege ich mir zwei Ansätze, wollte diese Frage hier aber zuerst stellen

  1. Wenn sich das .git- Repository an einem festen Ort befindet, z. B. irgendwo in / var , können wir eine Verknüpfung zum Unterpfad aus dem Arbeitsverzeichnis "target" herstellen. Das Hauptproblem: Ich kenne keine Möglichkeit, von / etc in ein anderes Verzeichnis zu "verlinken" , um nur den Inhalt zu importieren, außer das Verlinken einzelner Dateien
  2. Ich habe eine andere Alternative zu dieser SO-Frage gefunden und vorgeschlagen, mehrere Filialen in einem Repository zu haben. Dies würde sicherlich die Komplexität erhöhen, aber ich könnte sehen, wie wir es auf diese Weise versuchen.

Die Verwendung von git auf einem einzelnen Computer für die Verwaltung von Konfigurationsdateien funktioniert einwandfrei, aber ich glaube, es muss jemanden geben, der es so verwendet, wie wir es gerne verwenden würden.

Vielen Dank,
Kariem

Kariem
quelle

Antworten:

14

Ich habe so etwas schon einmal benutzt. So hat es funktioniert.

Repo Setup

  1. Erstelle ein Git Repo, "etc_files".
  2. Erstellen Sie eine Verzweigung für jeden Maschinentyp, z. B. "server / www", "server / dev" usw.
    • Git unterstützt Schrägstriche in Zweignamen. Dies hilft mir, die Zweige gerade im Kopf zu halten.
    • Wenn Sie nur wenige Maschinen haben, können Sie stattdessen eine Verzweigung für jede einzelne Maschine einrichten.
  3. Erstellen Sie einen Zweig für jede gemeinsam genutzte Infrastruktur, z. B. "modules / apache", "modules / cups" usw.
    • Diese Zweige dienen zum Speichern von Dateien, die für alle Computer gleich sind, z /etc/resolv.conf. Dies wären die Dateien, die Sie jetzt in "svn: externals" -Repos aufbewahren.

Eine neue Maschine bauen

  1. Klonen Sie auf einem neuen Computer das Git-Repo und überprüfen Sie den Zweig für diesen Computertyp.
    • Ich mache dies zu einem Nur-Lese-Klon, um zu verhindern, dass Änderungen von Produktionsmaschinen ohne Prüfung übernommen werden.
  2. Richten Sie einen Cron-Job ein, der git pulldas Repo jeden Tag automatisch erstellt .

Ändern von Maschinenzweigen

Das Ändern des Codes in einem einzelnen Computerzweig ist einfach. Nehmen git checkoutSie die Änderungen vor und übertragen Sie sie zurück in das zentrale Repository. Alle Maschinen in diesem Zweig erhalten die Änderungen automatisch, wenn der Cron-Job das nächste Mal ausgeführt wird.

Ändern von Modulzweigen

Das Ändern des Codes für einen Modulzweig ist nur geringfügig schwieriger, da zwei Schritte erforderlich sind:

  1. git checkout den entsprechenden Modulzweig
  2. Nehmen Sie Ihre Änderungen vor und übertragen Sie sie auf den zentralen Server.
  3. git checkoutjeden Maschinenzweig, der diesen Modulzweig verwendet, und führen Sie dann den Modulzweig darin zusammen. git wird herausfinden, dass Sie diesen Modulzweig zuvor zusammengeführt haben und nur die Änderungen bemerken, die seit dem letzten gemeinsamen Elternteil stattgefunden haben.

Diese Methode hat sowohl Vor- als auch Nachteile. Ein Vorteil ist, dass ich eine Änderung an einem Modulzweig vornehmen und ihn auf die Maschinenzweige anwenden kann, die ihn benötigen, so dass die Maschinenzweige, die nicht in der älteren Version bleiben, bis sie fertig sind. Der Nachteil ist also, dass Sie daran denken müssen, Ihren Modulzweig mit jedem Computerzweig zusammenzuführen, der ihn möglicherweise verwendet. Ich verwende ein Skript, das den Festschreibungsbaum durchläuft und dies automatisch für mich zusammenführt, aber es kann trotzdem schmerzhaft sein.


Alternativ unterstützen neuere Versionen von git sogenannte " Submodule ":

Mit Submodulen können fremde Repositorys in ein dediziertes Unterverzeichnis des Quellbaums eingebettet werden, das immer auf ein bestimmtes Commit verweist.

Auf diese Weise können Sie ein wenig wie "svn: externals" -Bäume erstellen, die Sie dann auf die gleiche Weise wie jetzt aktualisieren können.

Heimwerker5
quelle
Dies ist eine sehr detaillierte Ausarbeitung von Alternative 2, die ich in der Frage vorgeschlagen hatte. Groß! Es ist jedoch schwierig, die zweite Anforderung (Zurückschieben von Änderungen) zu implementieren, wenn sich der Repository-Stamm /aufgrund der Schreibberechtigungen befinden muss.
Kariem
Meinst du Schreibrechte für / etc? Oder um sich auf das Repository festlegen zu können? Ich verstehe leider nicht, woher das Problem kommt.
Handwerker5
@ Handyman5: On a new machine, clone the git repo and check out the branch for that machine type. Kann ich andere Filialen aus Sicherheitsgründen unzugänglich machen?
Eugene Yarmash
Sie können so etwas verwenden , um den Inhalt des Git-Repositorys auf die Computer zu exportieren. Dann wäre nicht auf jedem Computer das Repository vorhanden, sondern nur die Dateien in seinem Zweig. Wenn Sie Änderungssätze von jedem Computer auf die zentrale Fernbedienung übertragen möchten, ist mir keine Lösung bekannt, die sowohl ein einziges Repository als auch die Einrichtung von Zugriffssteuerungen für verschiedene Zweige ermöglicht. Vielleicht könntest du Subversion über http mit .htaccess auf dem Repo machen? Ich habe keine Ahnung, ob das funktioniert.
Handwerker5
@Handyman5: Es scheint, dass Subversion tatsächlich das richtige Werkzeug für die Aufgabe ist. Danke für Ihre Hilfe.
Eugene Yarmash
1

Ein kleiner Kniff hier, aber es klingt so, als ob ein Postempfangshaken den Job erledigen könnte

Der Repo-Master ist in / var / master gespeichert.
Der Hook klont ihn nach / var / localclone
und kopiert dann die hostspezifischen Details.
Sie müssten den .git / post-receive-Hook lokal auf jedem Server einrichten (mit den entsprechenden Einstellungen).

Es hört sich auch so an, als ob Sie eher eine Marionette oder einen Koch als ein Git möchten. Auf diese Weise können Sie git ausführen, um die Konfigurationen und Module zentral zu verwalten, und Puppet \ Chef die Bereitstellung und Überprüfung für Sie verwalten lassen

Tacticus
quelle
1

Hier ist eine kurze Arbeit, über die ich nachgedacht habe.
1. Haben Sie ein zentrales Repository in etwa /var/repo
.
3. für jede Sub - Domain Zweige anlegen /var/repo/subdomain1, /var/repo/subdomain2usw.
4. einen Beitrag Haken erstellen , in dem jeder Push - to - Zweig mit dem Master zusammengeführt wird.

Wenn Sie die Konfiguration ändern /var/repo/subdomain2, wird diese sofort mit dem Master zusammengeführt, sodass Sie das Repo vollständig
abrufen und alle Konfigurationsdateien haben können. Wenn Sie einzelne Subdomain-Konfigurationen abrufen möchten, ziehen Sie einfach den entsprechenden Zweig.

Wie legst du deine Konfigurationsdateien in /var/repo/* ist eine völlig andere Sache (Cron-Tabs, wie ich sie mir vorstellen kann).

~ $

Sudhi
quelle