fragen stichworte

Ist es möglich, Etckeeper mit einem einzigen gemeinsam genutzten Git-Repository zu verwenden?

Ich habe festgestellt, dass mehrere Personen empfohlen haben, etckeeper zu verwenden, um die Versionskontrolle auf mein Verzeichnis/etc anzuwenden.

Es scheint mir, dass bei der Standardinstallation ein Repository auf derselben Maschine abgelegt wird wie das Verzeichnis/etc, das Sie verwalten möchten. Dies funktioniert gut für die Versionskontrolle, bietet jedoch nicht den zusätzlichen Vorteil, eine Sicherungskopie der Dateien außerhalb des Servers zu erstellen - oder ich kann Teile von/etc von einem Quellcomputer auf einen anderen kopieren.

Kann ein einzelnes Git-Repository auf einem zentralen Verwaltungscomputer gemeinsam genutzt werden, sodass der Etckeeper auf jedem Server seine Daten an derselben Stelle speichert?

(Ich mache jetzt eine ähnliche Sache mit svn und einigen benutzerdefinierten Skripts, um Dateien zu übergeben und wiederherzustellen, aber ich muss daran denken, sie zu übergeben, wenn ich Änderungen vornehme.)

antworten

Verwenden Sie zunächst install etckeeper, das in/etc/etckeeper/etckeeper.conf für git konfiguriert ist. Folgen Sie der Installationsmethode von etckeeper für Ihre Distribution oder von der Quelle.

Bald haben Sie eine/etc/.git

Stellen Sie nun auf Ihrem Server sicher, dass Sie ein (sicheres) Repo haben, auf das Sie ...

drücken können
# ssh faruser@farhost     
 # mkdir somedir cd somedir && git init && chmod 700 .git    
 # exit

Nun müssen Sie auf dem ersten Host Ihr lokales Repo über ssh:

auf den Server laden
# cd/etc && git push faruser@farhost:somedir

Somedir kann in diesem Fall natürlich relativ sein (gemäß der ssh-Konvention)

Führen Sie dies jedes Mal durch, wenn Sie eine Änderung vornehmen, die/etc betrifft (und von etckeeper in/etc/.git gespeichert ist), und Sie haben sowohl lokale als auch externe Repos für Ihre Maschine.

Oder richten Sie das Kennwort ohne ssh ein und erstellen Sie einen Haken in/etc/etckeeper/commit.d/. Dies geschieht automatisch, wenn die Maschine immer verbunden ist.

Darum geht es nicht. Wenn Sie die Konfiguration weit verteilen möchten, richten Sie ein zusätzliches Repository zusätzlich zum lokalen Repo der einzelnen Maschinen ein und lassen Sie jede Maschine cherry-pick je nach Bedarf von dort herunterladen. Was bedeutet, dass jede Maschine davon abweichen kann (Zweig wirklich) und die Revisionskontrolle beibehält.

Es ist möglich, eine Remote-Zweigkonfiguration hinzuzufügen, um den Master-Zweig des Etckeeper-Repositorys von jedem Server einem Zweig im Remote-Repository zuzuordnen. Dazu können Sie auf jedem Server die folgenden Befehle ausführen:

cd/etc
git branch -m master $HOSTNAME
git remote add origin git@git.example.com:path/to/single/repo.git
git push -u origin master:$HOSTNAME

Nach diesem Setup sendet das nachfolgende git push Änderungen von jedem Server-Master-Zweig an den dedizierten Server-Zweig im zentralen Repository.

Obwohl die Zweige keinen gemeinsamen Ausgangspunkt haben, können Sie auf dieselbe Weise die gleiche Datei aus zwei verschiedenen Zweigen, die zwei verschiedene Server darstellen, durch Ausführen von

vergleichen
git diff origin/server1 origin/server2 -- file

Dies kann mit dem von jojoo vorgeschlagenen automatischen Setup kombiniert werden.

Wie man es automatisch macht, die ganze Geschichte:

Erstellen Sie die Datei/etc/etckeeper/commit.d/60-push (vergessen Sie nicht chmod + x) auf den Clients.

#!/bin/sh
git push central_server:/var/git/client_name.git master

central_server ist in der ssh-Konfiguration definiert, siehe unten./var/git/client_name.git ist das Verzeichnis auf dem zentralen Server, das den Git Repo enthält.

Die ~/.ssh/config von root (!) sollte etwa so aussehen:

host central_server
Hostname 192.168.0.1
User etckeeper #a user on the central server 
IdentityFile ~/.ssh/custom_key # key is in authorized_keys in
             #etcpeeper@central_server:~/.ssh/authorized_keys

Dann müssen Sie das Git Repo auf dem zentralen Server

initiieren  
mkdir/var/git/client_name.git
su etckeeper
cd/var/git/client_name.git
git --bare init

Teste es mit einer kleinen Änderung in/etc und dann einen Etckeeper Commit "test push'ing".