Search code examples
linuxvagrantrootsudovagrant-provision

How execute commands as another user during provisioning on Vagrant?


Vagrant executes my scripts as root during provision. But I would like to execute, during the provisioning time, some commands as another user. This is how I'm doing at the moment:

  su - devops -c "git clone git://github.com/sstephenson/rbenv.git .rbenv"
  su - devops -c "echo 'export PATH=\"$HOME/.rbenv/bin:$PATH\"' >> ~/.bash_profile"
  su - devops -c "echo 'eval "$(rbenv init -)"' >> ~/.bash_profile"
  su - devops -c "git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build"
  su - devops -c "echo 'export PATH=\"$HOME/.rbenv/plugins/ruby-build/bin:$PATH\"' >> ~/.bash_profile"
  su - devops -c "source ~/.bash_profile"

But I would like to make this nicer, something like this:

#become devops user here

git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile

# back to the root user here

Is this possible ? Thank you!


Solution

  • If you want to have the script inline with the rest you can use a command sequence such as the following.

    sudo -u devops /bin/sh <<\DEVOPS_BLOCK
    # Become devops user here
    id
    whoami
    # Back to the root user here
    DEVOPS_BLOCK