viernes 19 de marzo de 2010

Backup via FTP automatizado con Ruby

Recapitulando

Ya están las carpetas de trabajo de los usuarios de la empresa en el servidor de desarrollo (Goldberg), el repositorio subversion local sincronizado con el de Dreamhost, y además se hace una exportación de todos los proyectos todas las noches. El siguiente paso es hacer una copia de seguridad de todo esto, junto con la configuración de Goldberg.

En la empresa donde trabajo actualmente, tienen un servidor Windows 2003 Server con una unidad de cinta que copia los contenidos de su disco duro y de algunos más en distintos ordenadores de la red interna (todos Windows, of course, a los usuarios de Mac y Linux que nos den!). Lo que voy a hacer es crear un script que coja el contenido de varias carpetas seleccionadas y las mande por FTP a una de las máquinas cuya información entra en la copia de seguridad.

Objetivos

Quiero que todas las noches se copien las carpetas importantes del servidor de desarrollo en otra máquina, via FTP.

Paso a Paso

La lista de carpetas a exportar las pongo en un fichero de texto ubicado en la carpeta /etc/scripts del servidor de desarrollo, con el nombre backup_folders. Las carpetas importantes en mi caso son:


/etc (ficheros de configuración del servidor)
/home/eddy (carpetas de trabajo de los usuarios)
.....
/var/exported_projects (copia en limpio de los proyectos)
/var/subversion (carpeta donde se encuentran los repositorios)

Por otro lado, tenemos en la oficina una máquina Windows con un servidor FTP instalado, sin cuentas, permitiendo la subida anónima de ficheros. La carpeta donde se almacenan las subidas entra en la copia en seguridad en cinta que realiza el servidor Windows 2003 Server de la empresa.

Automatización

El script backup.rb se encarga de realizar la tarea de comprimir las carpetas especificadas en el fichero /etc/scripts/backup_folders, especificado en la constante BACKUP_LIST_PATH, y enviarlas por ftp a una máquina especificada. Puedes bajarte estos scripts desde rubyforge.


folder_list_file = ARGV[0] || BACKUP_LIST_PATH
tmp_folder = ARGV[1] || '/tmp'
Net::FTP.open('192.168.50.102') do |ftp|
ftp.login
File.open(folder_list_file).readlines.each do |line|
line.chomp!
puts "tar #{line}"
line =~ /([_a-z]*)$/
filename = $1
`tar -cz #{line} > #{tmp_folder}/#{filename}.tgz`
ftp.putbinaryfile "#{tmp_folder}/#{filename}.tgz"
`rm #{tmp_folder}/#{filename}.tgz`
end

El script no tiene mucha ciencia: abre una conexión ftp con la máquina en cuestión, y para cada una de las carpetas especificadas realiza la compresión en la carpeta temporal del sistema, envía el fichero tgz creado a la máquina FTP y tras esto lo borra de la carpeta temporal.

Tras meter una entrada en el crontab para que todas las noches llame al script, ya solo queda revisar los emails que envia el servidor de desarrollo para comprobar que la copia se está realizando correctamente y dormir tranquilo!

Conclusión

Voy a convencer a mi empresa para usar el Amazon S3 como backup alternativo, con lo que más adelante cambiaré todo esto. De momento me aseguro de tener lo esencial del servidor de desarrollo a salvo en otra máquina y en cinta, y sigo moviéndome adelante. Lo próximo: scripts para crear servidores virtuales de apache (incluyendo sus correspondientes entradas dns) para cada proyecto que se empiece.

0 comentarios:

Publicar un comentario en la entrada