Etc-Verzeichnis mit etckeeper versionieren

Aus Thomas Krenn Wiki
Wechseln zu: Navigation, Suche

Die Versionierung von Konfigurationsverzeichnissen empfiehlt sich aus Dokumentations- und Backup-Sicht. Zum einen werden alle Änderungen an Konfigurationsdateien mitprotokolliert und versioniert, zum anderen können frühere Versionen im Fehlerfall wieder hergestellt werden. Ganz ohne Vorsicht sind diese Features nicht zu genießen, da sich schützenswerte Informationen im etc-Verzeichnis befinden. Auf Verschlüsselung und restriktive Dateirechte bei der Übertragung bzw. Sicherung des Repos, in welchem das etc-Verzeichnis versioniert wird, ist daher zu achten.

Inhaltsverzeichnis

Etckeeper installieren

Der Source-Code von etckeeper kann vom Git-Repository unter [1] bezogen werden. Unter Ubuntu empfiehlt sich die Installation aus den Repositories:

:~$ sudo apt-get install git 
:~$ sudo apt-get install etckeeper

Etckeeper konfigurieren

Anschließend wird in der etckeeper-Konfiguration Git eingetragen:

:~$ sudo vi /etc/etckeeper/etckeeper.conf
# The VCS to use.
#VCS="hg"
VCS="git"
#VCS="bzr"
#VCS="darcs"
[...]

Weitere wichtige Optionen sind AVOID_DAILY_AUTOCOMMITS und AVOID_COMMIT_BEFORE_INSTALL. Diese sind beide per Default deaktiviert. Wer sich mit etckeeper näher beschäftigt und für alle Änderungen sinnvolle Commits erstellen möchte, sollte diese aktivieren.

AVOID_DAILY_AUTOCOMMITS=1
AVOID_COMMIT_BEFORE_INSTALL=1

Vor der ersten Initialisierung sollten noch folgende GIT Einstellungen (siehe Git Grundbefehle#Konfiguration von User- und E-Mail-Informationen) vorgenommen werden. Ansonsten kann es bei der Verwendung von git zusammen mit sudo zum Problem kommen, dass als Commiter immer "root" eingetragen wird.

git config --global user.name "Test User"
git config --global user.email "tktest@example.com"
git config --global core.editor "vim"

Daraufhin kann das Repository initialisiert werden:

:~$ cd /etc/
:/etc$ sudo etckeeper init
Initialized empty Git repository in /etc/.git/

Beim ersten commit werden alle vorhandenen Dateien in etc zum Repo hinzugefügt und von nun an versioniert:

:/etc$ sudo etckeeper commit "Initial etc commit"

Etckeeper verwenden

Wir nun eine Datei editiert, werden mittels Git die Änderungen protokolliert:

:/etc$ sudo vi /etc/phpmyadmin/apache.conf 
:/etc$ sudo git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   phpmyadmin/apache.conf
#
no changes added to commit (use "git add" and/or "git commit -a")

Die Änderung kann anschließend wieder verworfen oder ins Repo gespielt werden:

:/etc# git commit -a -m "Changed phpmyadmin apache.conf"
[master d589a0a] Changed phpmyadmin apache.conf
[...]
:/etc# git log
commit d589a0a6dfecbb19a5e24be0d6f3a02d2e915d28
Author: root <root@icinga.(none)>
Date:   Thu Nov 8 15:21:53 2012 +0100
 
    Changed phpmyadmin apache.conf
[...]

Datei/Verzeichnis Metadaten

Da git an sich keine vollständigen Datei/Verzeichnis Metadaten aufzeichnet, wurde von etckeeper ein pre-commit hook (/etc/.git/hooks/pre-commit) eingeführt. Dieser zeichnet in der Datei /etc/.etckeeper die chmod und chgrp Befehle auf, für alle Dateien die nicht den Standardrechten entsprechen.

...
maybe chmod 0755 './apticron'
maybe chmod 0644 './apticron/apticron.conf'
maybe chgrp daemon './at.deny'
maybe chmod 0640 './at.deny'
maybe chmod 0644 './bash.bashrc'
maybe chmod 0644 './bash_completion'
maybe chmod 0755 './bash_completion.d'
...

Datei zu gitignore hinzufügen

Dateien, die nicht per git im /etc/ Verzeichnis versioniert werden sollen, werden zur Datei /etc/.gitignore hinzugefügt. Darin befindet sich bereits eine Liste an Dateien, die standardmäßig von etckeeper ausgeschlossen sind. Nach den Pfaden, die von etckeeper verwaltet wrden - gekennzeichnet durch einen Kommentar # end section managed by etckeeper, werden die eigenen Pfade eingetragen. Das folgende Beispiel nimmt den Ordner vmware-tools' einer VMware-Gast-Maschine von der Versionierung aus:

:/etc$ sudo vi .gitignore
[...]
# end section managed by etckeeper
# begin manually added section
vmware-tools/*

Da sich die Dateien bereits im Index befinden, müssen sie vom diesen entfernt werden - git status zeigt immer noch an, dass sich vmware-tools/locations geändert hätte. Ein git rm --cached entfernt die Datei nur vom Index und lässt die Datei selbst unberührt:[1]

:/etc$ sudo git rm --cached vmware-tools/locations
rm 'vmware-tools/locations'
:/etc$ sudo git add .gitignore
:/etc$ sudo git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	modified:   .gitignore
#	deleted:    vmware-tools/locations
#
:/etc$ sudo git commit -a -m "Removed vmware-tools"
[master 79111f9] Removed vmware-tools
 3 files changed, 3 insertions(+), 4082 deletions(-)
 delete mode 100644 vmware-tools/locations

Einzelnachweise

  1. git-rm documentation (kernel.org)

Autor: Georg Schönberger


Share/Save/Bookmark  Feedback zu diesem Artikel geben