Gestion de ses fichiers de configuration avec git

Je me demandais comment pouvoir update proprement avec les distributions ne fonctionnant pas en rolling release. La plupart ne le sont pas d’ailleurs. Bref, c’est quand même super lourd de devoir réinstaller tout les paquets, en n’oubliant aucun…, et de se retaper la config. Donc comment faire ?

Ajout des paquets au kickstart

Utilisant Fedora, le problème de réinstaller les paquets sans en oublier ne posait pas vraiment de problème avec Kickstart. Il suffit de faire un inventaire de ses paquets et de le mettre dans le fichier kickstart. Voilà une méthode pour le faire simplement :

Editer le kickstart dans le home de root et supprimer les lignes sous %packages. Puis faire :

#
# rpm -qa -qf "%{NAME}\n" >> anaconda-ks.cfg

anacond-ks.cfg est votre kickstart avec la partie des packages vide. Cela vous donnera un fichier kickstart permettant de réinstaller avec les même logiciels. Reste maintenant à restaurer leurs configurations et le tour est joué.

Sauvegarde de la configuration

Pour cela, je me suis dis qu’un gestionnaire de versions serait l’idéal :). En plus de gérer vos versions de fichiers de configuration, ce qui est très utile, il permettra aussi leurs sauvegardes. Bon cela ne paraît pas forcément le plus intuitif du monde comme outil de sauvegarde mais je trouve ça élégant et bien moins casse tête. Bref, utilisant git assez souvent, je le choisis pour son côté décentralisé (tout autre système dans le genre, mercurial etc, aurait pu faire l’affaire mais bon, il est plus simple d’utiliser ce qu’on utilise déjà).

L’idée est de faire un dépôt git avec les fichiers qui sont modifié par mes soins ou souvent modifiés par des programmes tiers et de cloner celui-ci sur un stockage séparé, pour en faire une sauvegarde complète. Ensuite, j’utilise inotify et son copain incrond pour sauvegarder les fichiers qui m’intéresse à chaque modification.

Voici, ce que cela donne :

# yum install incron
# cd /etc
# git init

A ce point, on pourrait sauvegarder tout le dossier etc, mais cela ne sera pas propre et saloperait toutes restaurations complète de ce dossier. En effet, lorsque vous aurez réinstaller votre distrib préférée vous allez écraser pas mal de fichiers de conf qui peuvent avoir changés, en mieux, et vous priver de fonctionnalités voire même rendre certains logiciels plantogènes. Il vaut mieux faire un git add des fichiers/dossiers qui vous intéresse. Faites autant de dépôts que vous le voulez au travers de vos filesystems ou faites un dépôt sur la racine de votre système pour pas vous embêtez, à vous de voir.

Maintenant, il faut configurer la sauvegarde :

# cd /data/backup
# git clone file://127.0.0.1/etc/.git

Pour sauvegarder les données dans le clone maintenant, vous pouvez soit utiliser crontab et faire une sauvegarde par jour (ou heure ou ce que vous voulez) soit utiliser incrond pour sauvegarde lorsqu’un fichier est modifié même si celui-ci est modifié plusieurs fois par jour.
1er solution avec une sauvegarde par jour :

# crontab -e
@daily cd /etc && /usr/bin/git commit -a -m "Autocommit by cron" && cd /data/backup && git pull

2ème solution avec incrond :

# incrontab -e
/etc IN_CLOSE_WRITE /usr/local/sbin/incron_action.sh $@ $#

Le problème d’incron est qu’il n’accepte pas l’enchaînement de commande comme son copain cron, il faut donc passer par un petit script. Ce qui n’est pas plus mal au final:

DIR=$1
FILE=$2

BACKUP_DIR="/data/backup"

/usr/bin/logger -p local0.info "Incron Autocommit, file ${DIR}/${FILE} as been modified"
cd $DIR
/usr/bin/git commit -a -m "Incron Autocommit, file ${DIR}/${FILE} as been modified"
cd ${BACKUP_DIR}${DIR}
/usr/bin/git pull

Il pourra être largement amélioré mais il fera l’affaire.

La syntax des tables incron est celle-ci :

< dir_or_file > < event_flag > < actions >

Et pour avoir la liste des flags gérés par votre incrond, faites :

# incrontab -t
IN_ACCESS,IN_MODIFY,IN_ATTRIB,IN_CLOSE_WRITE,IN_CLOSE_NOWRITE,IN_OPEN,IN_MOVED_FROM,IN_MOVED_TO,IN_CREATE,IN_DELETE,IN_DELETE_SELF,IN_CLOSE,IN_MOVE,IN_ONESHOT,IN_ALL_EVENTS,IN_DONT_FOLLOW,IN_ONLYDIR,IN_MOVE_SELF

De plus dans les actions, on peut utiliser des variables contenant quelques menus informations sur l’élément impacté. Voici, les variables disponible :

  • $$ – Juste le symbole dollar
  • $@ – Chemin du dossier observé
  • $# – Nom du fichier sur lequel un évènement c’est produit
  • $% – Le flag de l’évènement qui c’est produit, version textuel
  • $& – La même mais version numérique.

Ce qui fait qu’on a passé à notre script le chemin et le fichier modifié.

Et voilà, on sauvegarde nos fichiers à chaque changement maintenant. C’est une version très basique et nécessiterai quelques changement, mais bon c’est un début.

A vous de vous amuser!

Posted Tuesday, August 7th, 2012 under Linux world, Tips&Tricks.

Leave a Reply