Los sistemas de control de versiones no son ninguna novedad (CVS, SVN, GIT, Mercurial...) lo que si es novedad es empezar a usarlos en sitios que hace unos años ni siquiera se hubieran contemplado.
Tenía ganas de hablar sobre este tema pero me acaba de convencer un bug que acabo de recibir: #537237 .
Desde hace ya varios meses en todos los servidores que administro y en mi portátil personal tengo montado el directorio /etc bajo control de versiones con GIT. Hacerlo es de lo más sencillo que hay:
cd /etc
git init
git add .
git commit -m "importado /etc"
¿Qué ventajas tiene esto?
Pues más que en un equipo de escritorio (que puede ayudarnos a arreglar cosas si andamos con Debian unstable) en los servidores es super útil.
¿Hay que crear un VirtualHost en Apache o editar cierta configuración?
Nuevo "commit" con su respectivo comentario y eso queda para la historia si alguna vez nos da problemas y no sabemos por donde arreglarlo tenemos el log y los diff.
Existen paquetes como etckeeper que se encargan de la parte más complicada por nosotros, pero a mi me sirve con usar git a pelo. Una de las cosas que he añadido es un disparador para apt que se encargue de hacer un commit cada vez que instalamos o desinstalamos algo. (lo tomé prestado de algún sitio y ahora no recuerdo donde)
#!/bin/bash
set -e
caller=$(ps axww | mawk '/aptitude|apt-get/ {for (i=5; i<=NF ; i++) printf ("%s ",$i); printf ("\n") }' | head -1)
STATUS="$(git status)" || true
if echo $STATUS | grep '\(modified\|new\|remove\)' > /dev/null 2>&1 ; then
echo "git-snapshot-script: found changed files"
echo $STATUS
git commit -a -m "snapshot after: $caller"
else
echo " **GIT** git-snapshot-script: no changes"
fi
echo " **GIT** git-snapshot-script: done"
Basicamente se lee el nombre de proceso que llama a este script (por ejemplo: apt-get install postfix) se mira si el directorio /etc ha cambiado y se hace el commit quedando en el log el programa que provoco esos cambios.
Para que el invento funcione debemos decirle a apt que llame al script:
cat /etc/apt/apt.conf
DPkg {
Post-Invoke {"cd /etc ; ./apt/git-snapshot-script";};
}
IMPORTANTE: Procura que el directorio /etc/.git solo pueda leerlo y escribirlo root (chmod 700 /etc/.git; chown root:root /etc/.git), con ese directorio se puede sacar el /etc/shadow por ejemplo y probar programas de fuerza bruta para sacar las contraseñas.
Mi vicio por git no termina aquí. Últimamente ando modificando unos cuantos CMS para uso personal o para clientes y un día puse esas web bajo control de versiones, ¡qué gozada! hacer mini-cambios y poder revertirlos, jugar con varias ramas, etiquetar... y para ejemplo un botón, Galopín es nuestro sistema de facturación interno y he ido tocando cosas que no acababan de convencerme, aquí está el git publicado. El primer import tiene parches ya de varios años de uso ;)