4

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!

Valter Silva
  • 16,446
  • 52
  • 137
  • 218

2 Answers2

5

when running the provisioning, its true that vagrant will run as root by default, you can change this behavior by making the provision as

config.vm.provision "shell", privileged: false blablabla

vagrant will then use the user defined as config.ssh.username, if its not set, its vagrant user by default

If you have multiple users on your system and still want to use another user, what I would do is to write a script and execute the script as su -l newuser -c "path to shell script"

Frederic Henri
  • 51,761
  • 10
  • 113
  • 139
4

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
Diomidis Spinellis
  • 18,734
  • 5
  • 61
  • 83