lunes, 19 de agosto de 2013

Sincronizar dos directorios con rsync y ssh

Bueno, hace 1000 años que no escribía, pero bueno acá estamos nuevamente..

Las bondades de la consola son infinitas, algo que los winboys desconocen, pero bueno no vamos ahora a contarles nada nuevo, sobre todo después de tantos años quienes pretenden administar seriamente un departamento de IT o se cuelguen el cartelito de experto en estas labores o se convirtieron a Linux o siguen sufriendo :P

Pero bueno, vamos a lo que nos compete.

Tengo en un ambiente de desarrollo un sitio web y quiero tener sincronizado el servidor de producción con el ambiente de desarrollo.

La primera es copiar y reescribir todo, pero bueno, sincronizar no es esta brutalidad de copiar y pisar todo, sino, agregar lo nuevo, reemplazar solo lo necesario y quitar lo que no va.

entonces con esta simple linea en la consola haremos lo siguiente:

conectarnos via ssh a nuestro server de produccion
copiar con rsync desde la carpeta origen a la carpeta destino
agregar los archivos nuevos
actualizar solo los que fueron modificados
eliminar de la carpeta destino los que ya no estan en la carpeta origen

en la practica:


Comando y parámetros

Lo primero que necesitamos es acceso vía SSH al equipo remoto. Puede ser por clave pública o con usuario y contraseña. Luego nos ubicamos en la carpeta que queremos respaldar y ejecutamos el comando:  

$ rsync -ravz /directorio/subdir/origen/ usuario@IP:/directorio/subdir/destino/


Donde:
  • r: recorre los directorios de manera recursiva
  • a: conserva los atributos de los archivos (usuario, permisos, etc)
  • v: imprime información en pantalla
  • z: comprime los datos antes de enviar
Luego de la autenticación comenzará la copia de los archivos. Es importante resaltar que en el destino debemos colocar la ruta absoluta a la carpeta.
Notar que tanto origen/ y destino/ tienen una barra al final /  porque sin esta barra se pueden copiar un directorio dentro de otro existente por ejemplo. Entonces para asegurarnos que se va a trabajar dentro de los directorios que deseamos tenemos que usar la barra al final.

 Si agregamos el parametro --delete borrara del destino todo lo que no se encuentre en origen.
Ej.

$ rsync -ravz --delete /directorio/subdir/origen/ usuario@IP:/directorio/subdir/destino/

A jugar.