Search code examples
shellvagrant

execute commands as user after Vagrant provisioning


There are some commands that have to be run as a normal user after the initial provisioning. I thought I could do this using a separate shell script and the command su --login -c <command> vagrant, but it's not getting the user's path or other environment settings from .bashrc.

e.g.:

#!/usr/bin/env bash
su --login -c "rbenv install 2.0.0-p353" vagrant
su --login -c "rbenv global 2.0.0-p353" vagrant
su --login -c "gem update --system" vagrant
su --login -c "yes | gem update" vagrant
su --login -c "gem install rdoc" vagrant
su --login -c "gem install rails pg" vagrant

Is there a way to do this? Maybe it has to be done with another provisioning tool like Puppet or Chef? I've thought of creating another shell script that sources the .bashrc, copying it to the box using a :file provisioner and executing the commands like that, but it seems sort of like a hack.

What's the right way to do this?


Solution

  • You should be able to do this using the Vagrant Shell provisioner, e.g.

    Vagrant.configure("2") do |config|
      $script = <<-SCRIPT
      rbenv install 2.0.0-p353
      rbenv global 2.0.0-p353
      gem update --system
      yes | gem update
      gem install rdoc
      gem install rails pg
      SCRIPT
    
      config.vm.provision "shell", inline: $script, privileged: false
    end
    

    The key is to specify privileged: false so that it will use the default user and not root.