Git Versionskontrolle

Bei Git handelt es sich um ein aus der Softwarentwicklung bekanntes verteiltes Versionsverwaltungstool. Hiermit lassen sich verschiedene Versionsstände von Textdateien verwalten und die Historie erfassen.

Um Änderungen an den Puppet Manifesten jederzeit nachvollziehen zu können und bei Bedarf wieder auf die letzte Version zurückkehren zu können, ist eine Versionsverwaltung vor allem in größeren Umgebungen zu empfehlen.

Vorbereitungen

Im ersten Schritt installieren wir die notwendigen Pakete.

apt-get install git # Ubuntu / Debian
 
yum install git # RedHat / CentOS

Benutzer erstellen

Anschließend erstellen wir einen neuen Benutzer git auf dem System über den die Administratoren später Änderungen einreichen können.

adduser git

SSH Key hinzufügen

Um später an das Git Verzeichnis Pushen zu können, muss der eigene Public Key zu der Datei authorized_keys hinzugefügt werden. Hierzu wechseln wir zunächst zum git Benutzer.

su git

mkdir ~/.ssh && touch ~/.ssh/authorized_keys

Auf unserem lokalen System übertragen wir jetzt den Key an den Server:

cat ~/.ssh/id_rsa.pub | ssh git@puppet.enteksystems.local "cat >> ~/.ssh/authorized_keys"

Repository anlegen

Im Anschluss legen wir ein neues Verzeichnis für die Repositories an

mkdir /home/git/repos

und erstellen eine neues Repository für unsere Puppet Module.

git init --bare /home/git/repos/puppet.git

Konfiguration der Git Hooks

Als Nächstes setzen wir die Git Hooks auf. Hierbei handelt es sich um Skripte, welche z.B. beim Übermitteln von Änderungen an das Git Repository (= Push) ausgeführt werden. In unserem Fall erfüllen die Hooks zwei grundlegende Funktionen.

  • Prüfung auf Syntaxfehler
  • Deployment in die Produktivumgebung

Vorbereitungen / Abhängigkeiten

Alle notwendigen Git Hooks stehen im GitHub Repository von David Wahlstrom zur Verfügung. Da einige Hooks noch weitere Skripte benötigen, laden wir das gesamte Repository herunter.

cd /tmp
 
git clone https://github.com/drwahl/puppet-git-hooks.git

Im ersten Schritt kopieren wir die benötigten Skripte in unser Git Repository.

cp -r /tmp/puppet-git-hooks.git/commit-hooks /home/git/repos/puppet.git/hooks/

Pre-Commit

Zunächst konfigurieren wir den pre-commit Hook. Hierzu wechseln wir in das Verzeichnis /home/git/repos/puppet.git/hooks und kopieren die Hook Datei bzw. machen sie anschließend ausführbar. Hiermit wird der Code bereits clientseitig beim Commit auf evtl. Fehler geprüft.

cp -r /tmp/puppet-git-hooks.git/pre-commit ./
 
chmod +x pre-commit

Pre-Receive

Im nächsten Schritt erfolgt die Installation des pre-receive Hooks. Dieser prüft den Code vor dem Pushen (Übermitteln) an das Puppet Repository und stellt damit die zweite Prüfungsinstanz dar.

cp -r /tmp/puppet-git-hooks.git/pre-receive ./

chmod +x pre-commit

Post-Receive

Den post-receive Hook verwenden wir zum Deployment des geprüften Codes in die Produktivumgebung. Hier kommt eine angepasste Implementierung aus unserem FoxPlex Blog zum Einsatz.

nano post-receive
#!/bin/bash

while read oldrev newrev refname 
do
   branch=$(git rev-parse --symbolic --abbrev-ref $refname)
 
   if [ "$branch" == "production" ];
   then
 
      # Production
      echo "Pushing to production"
      mkdir /tmp/production
 
      GIT_WORK_TREE=/tmp/production git checkout production -f
 
      rsync -ruvz /tmp/production/ /etc/puppet/environments/production/
 
      rm -rf /tmp/production
      rm -rf /tmp/rsync;
 
   fi
 
done
chmod +x post-receive

Der Rsync Befehl kann z.B. auch durch SCP ersetzt werden, wenn das Git Repository nicht auf dem Puppet Master liegt.