Error al ejecutar rsync en Vagrant mediante node.vm.synced_folder

Esta es una receta un pelín vieja para resolver un problema que me encontré al trabajar con Vagrant, por lo que es posible que ya este corregido en versiones actuales; aunque en su momento, en la última disponible, vagrant-1.9.5, fue la única forma de hacer funcionar rsync entre Vagrant y la VM en HyperV en Windows 8.1.

El problema surgía al sincronizar, mediante node.vm.synced_folder, una carpeta local de Windows a una carpeta de la VM desplegada con Vagrant. Concretamente me dió problemas al adaptar unos antiguos scripts para aprovisonar los nodos de un clúster Spark. Los scripts tiraban de recursos en Internet, que ya no estaban accesibles por lo que no era posible levantar el mismo entorno de desarrollo que el que estaba en producción, por lo que el paso que dí fue copiar todos los recursos a una carpeta local y modificar el vagrantfile para que tirara desde recursos locales.

La solución que encontré fue editar el archivo \plugins\synced_folders\rsync\helper.rb, en mi caso localizado en C:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.9.5\plugins\synced_folders\rsync\helper.rb, y aplicar el siguiente fix:

Localizar el siguiente bloque:

1
2
3
4
5
6
7
8
9
# Build up the actual command to execute
command = [
"rsync",
args,
"-e", rsh.flatten.join(" "),
excludes.map { |e| ["--exclude", e] },
hostpath,
"#{username}@#{host}:#{guestpath}",
].flatten

Y añadir hostpath = "/cygdrive" + hostpath justo antes del seteo de la variable command; el bloque debe quedar:

1
2
3
4
5
6
7
8
9
10
# Build up the actual command to execute
hostpath = "/cygdrive" + hostpath
command = [
"rsync",
args,
"-e", rsh.flatten.join(" "),
excludes.map { |e| ["--exclude", e] },
hostpath,
"#{username}@#{host}:#{guestpath}",
].flatten

Contenidos