Es ergibt Sinn die puppet Konfiguration in einem GIT Repository zu verwalten. So kann man immer auf alte Versionen zurueckgehen sowie automatische Pruefungen zwischenschalten bevor man Aenderungen Live schaltet. Sexy wird das ganze mit push-to-deploy. So wird es gemacht:
Vorbereitungen auf dem puppet server
mkdir -p /srv/git/puppet cd /srv/git/puppet git init --bare addgroup puppet-push chgrp -R puppet-push /srv/git/puppet find /srv/git/puppet -type d -exec chmod 0775 {} ; find /srv/git/puppet -type d -exec chmod +s {} ; chgrp -R puppet-push /etc/puppet chmod 775 /etc/puppet |
Damit mein Benutzername auch in das GIT Repository schreiben darf muss dieser Mitglied in der Gruppe puppet-push sein:
adduser USERNAME puppet-push |
Nun benoetigen wir zwei Hooks in dem Repository. Einen update Hook der die Syntax ueberprueft, und ein post-receive Hook, der bei Bedarf die gepushten Dateien gleich an die richtige Stelle kopiert:
cd /srv/git/puppet/hooks/ wget http://git.pregos.info/scripts.git/blob_plain/HEAD:/push-to-deploy/update chmod +x update http://git.pregos.info/scripts.git/blob_plain/HEAD:/push-to-deploy/post-receive chmod +x post-receive |
Anschliessend sind auf Server Seite keine weiteren Aenderungen mehr notwendig.
Vorbereitungen auf dem lokalen Rechner
Bei sich lokal auf dem Rechner muss man nun ein Verzeichnis erzeugen, die aktuellen Dateien vom puppetmaster.example.org:/etc/puppet dorthin kopieren, GIT Repository initialisieren und committen:
mkdir ~/puppet cd ~/puppet scp user@puppetmaster.example.org:/etc/puppet . git init git add . git commit -m "initial commit" |
Nun noch das remote Repository hinzufuegen und pushen:
git remote add live user@puppetmaster.example.org:/srv/git/puppet git push live master |
Wenn alles richtig ist, dann ist die Ausgabe in etwa wie folgt:
user@client:~/git/puppet$ git push live master Counting objects: 22, done. Delta compression using up to 4 threads. Compressing objects: 100% (16/16), done. Writing objects: 100% (22/22), 4.91 KiB | 0 bytes/s, done. Total 22 (delta 2), reused 0 (delta 0) remote: fatal: bad object 0000000000000000000000000000000000000000 remote: remote: diff-tree: remote: Already on 'master' remote: DEPLOY: master(bd01768f198a2513ba82f5f8765b4b222908ce4b) copied to '/etc/puppet' To user@puppetmaster.example.org:/srv/git/puppet * [new branch] master -> master |
Syntaxfehler fuehren dazu, dass die Aenderungen nicht uebernommen werden:
user@client:~/git/puppet$ git push live master Counting objects: 7, done. Delta compression using up to 4 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (4/4), 328 bytes | 0 bytes/s, done. Total 4 (delta 2), reused 0 (delta 0) remote: remote: diff-tree: remote: :100644 100644 c31414e094fbbf3af3792965f2f706ede6a70d24 f47cd2be9c7b3a9d4e23b885b2252ac0579319d2 M manifests/site.pp remote: remote: err: Could not parse for environment production: Syntax error at end of file; expected '}' at manifests/site.pp:6 remote: err: Try 'puppet help parser validate' for usage remote: For more details run this: git diff c31414e094fbbf3af3792965f2f706ede6a70d24 f47cd2be9c7b3a9d4e23b885b2252ac0579319d2 remote: remote: error: hook declined to update refs/heads/master To user@puppetmaster.example.org:/srv/git/puppet ! [remote rejected] master -> master (hook declined) error: Fehler beim Versenden einiger Referenzen nach 'user@puppetmaster.example.org:/srv/git/puppet' |
Die Informationen sind zusammengetragen von: