Vagrant synced folder options

10,126

Solution 1

In Vagrantfile you can assign the current uid/gid to the nfs mapping. (See on host /etc/exports after provisioning.)

 config.nfs.map_uid = Process.uid   
 config.nfs.map_gid = Process.gid 

With Puppet as provisioner you can facter these values:

 config.vm.provision :puppet, :facter => { 
     "host_uid" => config.nfs.map_uid, 
     "host_gid" => config.nfs.map_gid, 
 } do |puppet| ...

So you can use it in puppet scope like variables e.g.

user { "www-data":
    ensure => present,
    uid => $::host_uid,
    gid => $::host_gid,
}

I think in chef the custom json option is the equivalent to use it later in chef recipes

Vagrant.configure("2") do |config|
  config.vm.provision "chef_solo" do |chef|
        # ...

        chef.json = {
          "map" => {
            "uid" => config.nfs.map_uid,
            "gid" => config.nfs.map_gid
          }
        }
      end
    end

Solution 2

bindfs

GitLab was using bindfs before it deprecated Vagrant as development method.

There is even a Vagrant plugin for it at: https://github.com/gael-ian/vagrant-bindfs

Relevant Vagrantfile lines when the file was still part of the project:

config.vm.synced_folder ".", "/vagrant", :disabled => true
config.vm.synced_folder "./home_git", "/git-nfs", :nfs => true
config.bindfs.bind_folder "/git-nfs", "/home/git", :owner => "1111", :group => "1111", :'create-as-user' => true, :perms => "u=rwx:g=rwx:o=rwx", :'create-with-perms' => "u=rwx:g=rwx:o=rwx", :'chown-ignore' => true, :'chgrp-ignore' => true, :'chmod-ignore' => true
Share:
10,126
Douglas Choma
Author by

Douglas Choma

Updated on July 14, 2022

Comments

  • Douglas Choma
    Douglas Choma almost 2 years

    What is the best method for implementing Vagrant NFS "synced folders" between host and VM?

    I was finally able to get NFS working, in general, but it required several tweaks within the VM; and I'm not sure how to automate those changes for others to use.

    Specifically, I have to modify the UID/GID in /etc/passwd and /etc/group to match those of the user/group of the exported filesystem. (e.g. host machine uses 502:20, VM apache user must be set to use 502:20 as well)

    Without this change, I have all kinds of permission/ownership issues that prevent the web app from running. With the UID/GID matching, everything works great.

    I've read all the docs I could find, including the Vagrant web site.

    As a side note: I also tried native folder sync (painfully slow) and rsync (100% CPU... unusable)

    NFS seems like the winner for performance, but my setup is sketchy.

    If it makes any difference, I'm working with the following:

    • Host: OS X 10.9.2
    • Vagrant: 1.5.4
    • Provider: VMware Fusion
    • Box: chef/centos-6.5
    • Dev app: Magento 1.8