Qui n’a pas, un jour, eu besoin de récupérer une version de fichier écrasée par Puppet ?
Pas vous n’est-ce pas ? Car vous ne modifiez jamais vos fichiers managés par Puppet localement sur une machine client bien sûr !
Toutefois, ce cas peut-être utile :
Le script suivant va vérifier dans le /var/log/message les fichiers modifiés par Puppet et vous donne l’emplacement de la sauvegarde du fichier modifié dans le Filebucket. Pour récupérer le contenu du fichier correspondant, faire un cat ou un cp
Tout cela n’est bien entendu possible que si le filebucket local n’est pas désactivé sur les clients.
Ce script est applicable à la version Community (Open Source), toutefois, il est facilement transposable à la version Enterprise.
#/bin/bash # Recherche dans le /var/log/messages #Exemple : # Oct 28 11:01:36 mylocallinux puppet-agent[30297]: (/File[/etc/pam.d/system-auth]/content) content changed '{md5}36d487e07f2e30531c562e0e406dc4ad' to '{md5}e6e84846529165d489eb6ffb59e4e225' color_diff() { sed 's/^ -/ \x1b[31m-/;s/^ +/ \x1b[32m+/;s/^ @/ \x1b[34m@/;s/$/\x1b[0m/' } BOLD=$(echo -e '\x1b[1m') REGULAR=$(echo -e '\x1b[0m') RED_INV=$(echo -e '\x1b[41m') NO_INV=$(echo -e '\x1b[49m') show() { file=$(echo $4 | sed -e 's,^(/File\[\([^]]\+\).*,\1,') from=$(echo $5 | sed -e 's/.*{md5}\([[:xdigit:]]\+\).*/\1/') to=$(echo $6 | sed -e 's/.*{md5}\([[:xdigit:]]\+\).*/\1/') #echo "*** $1 $2 $3 $4 $5 $6 ***" echo "${BOLD}$1 $2 $3 $file changed:$REGULAR" ffrom=$(find /var/lib/puppet/clientbucket/ -type d -name $from) fto=$(find /var/lib/puppet/clientbucket/ -type d -name $to) if [ -e "$ffrom" -a -e "$fto" ] ; then diff -u $ffrom/contents $fto/contents | sed -e 's/^/ /' | color_diff elif [ -e "$ffrom" -a ! -e "$fto" ]; then curr_md5=$(md5sum $file | cut -d " " -f 1) if [ "$to" = "$curr_md5" ];then diff -u $ffrom/contents $file | sed -e 's/^/ /' | color_diff else echo " ${RED_INV}ERROR: can't diff from '$from' and '$to'. '$to' doesn't exist.$NO_INV" fi else echo " ${RED_INV}ERROR: '$from' or '$to' doesn't exist.$NO_INV" fi } grep -h puppet-agent /var/log/messages{-*,} \ | awk '{ if ($5 ~ /puppet-agent.*/ && ($7 " " $8 ~ /content changed/) ) {print $0}; }' \ | while read month day time host process file content changed from _to to; do if [ "$content $changed" = "content changed" ]; then show $month $day $time $file $from $to fi done