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
Das Git Repository kann auch auf einem anderen Server (z.B. zentrale Versionskontrolle) installiert werden und muss nicht zwingend auf dem Puppet Master liegen.
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
Damit werden alle Änderungen im Branch production
nach der Übermittlung an unser Puppet Repository in das Puppet Verzeichnis eingespielt und somit produktiv gesetzt. Änderungen, welche im Standardbranch master
oder anderen Branches erfolgen werden nicht automatisch in die Produktivumgebung eingespielt.
Der Rsync Befehl kann z.B. auch durch SCP ersetzt werden, wenn das Git Repository nicht auf dem Puppet Master liegt.