miércoles, 18 de enero de 2012

Sincronización con RSync

RSync es una herramienta para Unix que permite sincronizar una carpeta con otra (remota o no) o como los autores especifican en la man page: "a fast, versatile, remote (and local) file-copying tool".


Los casos de uso son variados según la necesidad, por ejemplo, tenemos una copia local de archivos fuente de un proyecto web, deseamos publicar las modificaciones en el servidor de producción. Este sería el más común (por lo menos en mi caso) de los escenarios.




La carpeta src dentro del server A (o pc de trabajo) puede tener archivos que no se necesiten subir, o carpetas que no debe porque matchear contra la que está en el servidor B, todo esto lo resuelve el rsync según la configuración utilizada.


Como dije antes, es un comando de Unix, es por esto que tenemos la ventaja de usar "la bash" para generar un script completo complejo  que nos permita realizar muchas tareas.


Especificación del comando
rsync {opciones} {conexión} {origen} {destino}


Opciones

  • -v, --verbose               Extender info
  • -q, --quiet                 Suprimir información que no sean errores
  • -c, --checksum              utilizar solo el checksum para evaluar la comparación de archivos
  • -a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
  • -r, --recursive             recursivo dentro de directorios
  • -b, --backup                realizar un backup (ver --suffix & --backup-dir)
  •     --backup-dir=DIR        realizar backup dentro de DIR
  •     --suffix=SUFFIX         backup suffix (default ~ w/o --backup-dir)
  • -p, --perms                 preservar permissions
  • -E, --executability         preservar executability
  • -o, --owner                 preservar owner (super-user only)
  • -g, --group                 preservar group
  • -t, --times                 preservar modification times
  • -n, --dry-run               Realizar una corrida en seco, excelente para poder probar si lo que hacemos es lo que necesitamos.
  • -z, --compress              comprimir durante la transferencia
  •     --compress-level=NUM    compression level
  • -f, --filter=RULE           Necesario al momento de realizar exclusiones (por ejemplo, carpetas .svn, archivos .project, etc)
  •     --exclude=PATTERN       matching PATTERN
  •     --exclude-from=FILE     Desde un archivo "FILE"
  •     --include=PATTERN       inverso al exclude
  •     --include-from=FILE     inverso exclude-from
  •     --files-from=FILE       inverso files-from
  • -h, --human-readable        En formato legible por humanos
  •     --progress              Mostrar el progreso (esto genera mucha suciedad al momento de ver el log)
  • -4, --ipv4                  preferir uso de IPv4
  • -6, --ipv6                  preferir uso de IPv6
  •     --delete                borrar archivos del destino que no macheen
Yo particularmente utilizo la configuración: -avz con eso basta para transferir los archivos de una carpeta a otra.

Script para bash:

#!/bin/bash
HOME=/home/usuario/carpeta/src/
DEST=/var/www/sitio/src/
rsync -avz --delete --exclude=.svn --exclude=Thumbs.db  $HOME $DEST
echo "Done"

En los casos donde deba copiar por ssh al servidor de destino:

#!/bin/bash
HOME=/home/usuario/carpeta/src/
DEST=usuario@ip_destino_o_direccion:/var/www/sitio/src/
rsync -avz --delete --exclude=.svn --exclude=Thumbs.db  $HOME $DEST
echo "Done"

Luego podemos combinar opciones del ssh (como por ejemplo obtener el password para conectarse desde un archivo) para incrementar los usos de ambas herramientas según nuestra necesidad.

No hay comentarios: