atomic rsync

¿Alguna vez te has planteado la manera de hacer un rsync a varias máquinas de la manera más atómica posible?

Yo si, muchas veces, por ejemplo para hacer deploy de alguna web con la mayor consistencia posible, de forma que el cambio sea lo más instantaneo posible, sin que haya momentos en que parte de la web tenga los ficheros antiguos y otra parte los nuevos, o incluso que en un server esté corriendo la versión vieja de la web y en otro la nueva

La solución más chula que he encontrado es la siguiente:

REMOTE=remotehost
ORIGIN=/mnt/webs/somesite
DEST=/var/www/somesite
rsync -av --link-dest=$DEST $ORIGIN/ remotehost:$DEST.new && \
ssh $REMOTE "mv $DEST $DEST.old && mv $DEST.new $DEST"

La magia está en la opción –link-dest
Con ella le decimos el directorio donde están los datos reales que queremos sincronizar, pero luego como opcion destino de rsync especificamos un directorio intermedio, que luego moveremos con un simple mv

De esta manera, primero hacemos un rsync para duplicar el directorio destino, y luego cambiamos un directorio por otro

Si tenemos que hacer una subida a un montón de servers, podemos primero hacer los rsyncs a todos y luego cuando todos estén hechos realizamos el mv, consiguiendo asi una sincronia en la operación muchisimo mayor que si lanzaramos los rsync directamente contra el directorio destino:


for host in $HOSTS; do
rsync -av --link-dest=$DEST $ORIGIN/ remotehost:$DEST.new
done
for host in $HOSTS; do
ssh $REMOTE "mv $DEST $DEST.old && mv $DEST.new $DEST"
done

postfix: trazando rutas en base a cabeceras

Hola amiguitos!

Hoy nos hemos encontrado con el dilema de cómo mandar mails con tope de prioridad a través de un relay_host diferente

Nuestra solución ha sido examinar la cabecera Return-Path con una regexp para decidir si eran o no correos de alta prioridad

  • configuramos postfixde la siguiente manera:
    /etc/postfix/main.cf
    header_checks=pcre:/etc/postfix2/header_checks
    /etc/postfix/header_checks
    /^Return-Path: .*important_list.*@ourdomain.com/ FILTER smtp:192.168.10.71
  • Creamos el mapa y reiniciamos el servicio
    # postmap /etc/postfix/header_checks
    # postfix reload

En caso de querer hacer el match con algo contenido en el cuerpo del mensaje en lugar de las cabeceras, podemos usar body_checks