Installation

À faire dès la première prise en main d'un système, et avant toute autre modification :

sudo apt-get install etckeeper

Il se peut que d'autres paquets soient installés en même temps que etckeeper, mais ne soient configurés qu'après la configuration de etckeeper (c'était le cas de rsync lors de l'installation de bulbe). Il est donc préférable de lancer tout de suite :

sudo etckeeper commit

Configuration

Dans /etc/etckeeper/etckeeper.conf, pour que les changements soient référencés manuellement et que manuellement, désactivation des commits automatiques :

AVOID_DAILY_AUTOCOMMITS=1
AVOID_COMMIT_BEFORE_INSTALL=1

On ajoute également certains fichiers manquants à /etc/.gitignore et on les retire de la gestion de versions (etckeeper vcs rm --cached fichier) :

group-
passwd-
shadow-
gshadow-
subuid-
subgid-

Automatisations

Si les commits eux-mêmes sont manuels, d'autres actions ont été automatisées à l'aide de hooks :

/etc/etckeeper/init.d/30initial-package-list
/etc/etckeeper/post-install.d/10refresh-package-list
Afin de garder trace de toutes les installations/suppressions de paquets Debian (même ceux qui n'installent rien dans /etc), ces deux petits scripts vont tout simplement écrire un fichier /etc/.package-list qui sera mis dans le dépôt au même titre que les autres fichiers de configuration. Sa modification par le script 10refresh-package-list entraînera donc systématiquement un changement, et ce dernier sera enregistré par /etc/etckeeper/post-install.d/50vcs-commit.
/etc/etckeeper/commit.d/10postalias
Pour éviter de laisser tourner Postfix avec une configuration obsolète quant aux destinataires et aliases locaux, les databases binaires (*.db) sont recompilées si leur source (version texte) a été modifiée, ceci afin de nous épargner quelques soucis consécutifs à nos oublis récurrents.
/etc/cron.hourly/etckeeper-warn-changes

Toutes les heures, ce script analyse l'état du dépôt git /etc. En fonction du résultat de cette analyse, il envoie un message à root@localhost (alias machines@nos-oignons.net) pour signaler que des changements n'ont pas été enregistrés, ou synchronise un dépôt de sauvegarde si des modifications ont été enregistrées, ou bien ne fait rien. Si des modifications n'ont pas été commitées, le sujet du message peut varier en fonction d'un marqueur /var/lib/etckeeper/last-warning; pour que cela fonctionne, il ne faut pas oublier de créer le répertoire /var/lib/etckeeper lors de l'installation du script cron.

Un clone du dépôt git est situé dans /var/backups/etc.git. À chaque synchronisation, un e-mail sera envoyé avec le résumé des nouvelles modifications enregistrées. Cette synchronisation a lieu une heure après le dernier enregistrement afin de ne pas recevoir de trop nombreux e-mails.

/usr/local/bin/wheezy-post-receive-email
Il s'agit d'une copie de la version précédente (Debian 7 Wheezy) du hook /usr/share/git-core/contrib/hooks/post-receive-email, dont la version actuelle cause quelques soucis (bounces) à notre système de messagerie.

Utilisation

Il est préférable de commettre les modifications aussi souvent que possible pour profiter pleinement de cet outil, en ayant un commit (donc aussi un log et un diff) distinct pour chaque modification ou ensemble cohérent de modifications.

Les commandes qui vont bien

sudo etckeeper commit
est préférable à sudo git commit ou etckeeper commit exécuté depuis un shell root, parce que ça permet de savoir qui a fait la modification.
sudo etckeeper vcs log
permet de suivre l'historique des changements. log peut être remplacée par toute autre commande interne de git (status ou diff par exemple).

NOTES

  1. sudo a été configuré pour que les membres du groupe sudo n'aient pas à s'authentifier lors de l'invocation des commandes de consultation suivantes :

    • sudo etckeeper vcs status
    • sudo etckeeper vcs diff
    • sudo etckeeper vcs log
    • sudo etckeeper unclean
  2. Avec ZSH, il est facile de faire un script zlogout qui signale la présence de modifications pas encore commitées :

    #!/usr/bin/zsh

    if sudo etckeeper unclean; then
        cat <<-EOF
        Des fichiers n'ont pas été enregistrés avec etckeeper :
        $(sudo etckeeper vcs status)

        Les dernières connections sont :
        $(last -5)
        EOF
    fi