Etc-Verzeichnis mit etckeeper versionieren

Aus Thomas-Krenn-Wiki
Zur Navigation springen Zur Suche springen

Eine Versionierung von Konfigurationsverzeichnissen ist aus Dokumentations- und Backup-Sicht sinnvoll. Damit werden alle Änderungen an Konfigurationsdateien mitprotokolliert und versioniert, außerdem 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. Dieser Artikel zeigt die Versionierung mit der Software etckeeper mit git.

Etckeeper installieren

Der Source-Code von etckeeper kann von dessen Git-Repository bezogen werden.[1]

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:[2]

:/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

Konfigurationsänderungen in einem Branch testen

Wenn Sie neue Konfigurationen von Dateien in /etc testen möchten, können Sie dazu einen eigenen Git Branch erstellen. In diesem Beispiel nennen wir ihn no-apt-sources zum Testen einer apt-Konfiguration ohne src-Repositories. Mittels git checkout wechseln wir anschließend in den Branch:

sudo git branch no-apt-sources
sudo git checkout no-apt-sources

Nun nehmen wir Änderungen an der apt-Konfiguration vor und führen anschließend ein git commit aus, um die Änderung zu Versionieren:

sudo vi /etc/apt/sources.list
sudo git commit -a

Nach dem Testen wechseln wir zurück in den Master-Branch:

sudo git checkout master

Nun haben wir 2 Möglichkeiten:

  1. Wir wollen die durchgeführte Änderung übernehmen. Dazu führen wir für den Branch ein git merge aus und löschen anschließend den nun nicht mehr erforderlichen Branch:
    sudo git merge no-apt-sources
    sudo git branch -d no-apt-sources
  2. Wir möchten die Änderungen dauerhaft verwerfen. Achtung: dabei wird der vorhin erstellte Branch vollständig gelöscht:
    sudo git branch -D no-apt-sources

Einzelnachweise

  1. etckeeper Git-Repository (etckeeper.branchable.com)
  2. git-rm documentation (kernel.org)


Foto Georg Schönberger.jpg

Autor: Georg Schönberger

Georg Schönberger, Abteilung DevOps bei der XORTEX eBusiness GmbH, absolvierte an der FH OÖ am Campus Hagenberg sein Studium zum Bachelor Computer- und Mediensicherheit, Studium Master Sichere Informationssysteme. Seit 2015 ist Georg bei XORTEX beschäftigt und arbeitet sehr lösungsorientiert und hat keine Angst vor schwierigen Aufgaben. Zu seinen Hobbys zählt neben Linux auch Tennis, Klettern und Reisen.


Das könnte Sie auch interessieren

Git Branches
Git Commits mit rebase zusammenführen
Git Daemon