I am trying to build a Vagrant box (CentOS) that will be provisioned by an install.sh
shell script. This script will do several things, the first of which, involves creating the correct directory structure under /opt
so that my service can be installed there and do other things, like writing logs there, as well.
So my Vagrant project (so far) consists of:
my-app-vagrant/
Vagrantfile
install.sh
Where install.sh
looks like:
mkdir /opt/myapp
mkdir /opt/myapp/bin # Where we will install binary to (later in this script)
mkdir /opt/myapp/logs # Where the binary will write logs to
Now the binary does not need elevated privileges in order to run (it is configured via command-line arguments where to write logs to). However I simply want it to live under /opt
with the above directory structure, at least for this particular machine.
The problem is that /opt
is owned by root
. Which means I need to run these mkdirs
with sudo
, provide the script the password for sudo
, and then tweak directory permissions so that when the app runs, it has permission to both run and to write logs to my intended destination (which again, is /opt/myapp/logs
). So I tweaked install.sh
to look like this:
mkdir /opt/myapp
mkdir /opt/myapp/bin
mkdir /opt/myapp/logs
chmod -R 777 /opt/myapp # Now when the app runs as a normal non-privileged user, we can run + write logs
And I know that I can provide a password to the script via echo <rootPswd> | sudo -S sh install.sh
(where <rootPswd>
is the correct root password).
Now I'm trying to figure out how to get this running/working correctly when Vagrant is provisioning the VM.
My Vagrant file looks like:
Vagrant.configure(2) do |config|
config.vm.provision "shell", path: "install.sh"
config.vm.box = "centos7"
config.vm.box_url = "https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box"
config.vm.network "private_network", ip: "10.0.1.2"
config.vm.provider "virtualbox" do |vb|
vb.memory = "2048"
end
end
But what I'm stuck on is: how do I extend the whole "echo <rootPswd> | sudo -S sh install.sh
"-concept to Vagrant? According to their docs there is a privileged
option that I might be able to use, but it is set to true
by default anyways.
But nowhere in their docs do they explain how/where to provide the sudo
password that should be used (at least from what I have been able to find so far).
So I ask:
sudo
password for a Vagrant VM's shell provisioner's installation script?; andsudo
password even if, given the base Vagrant box that I'm trying to use?Turns out that (for almost all Vagrant boxes) the vagrant
user is listed in /etc/sudoers
with ALL=(ALL) NOPASSWD:ALL
permissions, which instructs Linux to not ask that user for a "sudo password", ever.
Hence, you don't need to supply your privileged
user with a sudo password.