Search code examples
shellvagrantprovisioning

Vagrant - Provisioning script not changing directory


New to vagrant, please help!

Vagrantfile

Vagrant.configure("2") do |config|
  config.vm.box = "laravel/homestead"
  config.vm.provision "shell", path: "vm-setup/provision.sh"
end

vm-setup/provision.sh

# Update apt-get
apt-get -y update

# Install tree
apt-get install tree

# Create .bash_aliases
sudo echo 'alias cls="clear"' >> ~/.bash_aliases

sudo chsh -s $(which zsh) vagrant

cd /vagrant

provision.sh file runs fine. When I run "vagrant provision" it updates apt-get, installs tree and even changes the shell to ZSH.

But sudo echo 'alias cls="clear"' >> ~/.bash_aliases and cd /vagrant lines do not work, not sure why. When I vagrant ssh into the machine, I am being taken to root directory (/home/vagrant). I would like to start in /vagrant folder.


Solution

  • Vagrant's shell provisioner by default runs with privileged = true:

    privileged (boolean) - Specifies whether to execute the shell script as a privileged user or not (sudo). By default this is "true".

    When you perform vagrant ssh you login to a VM as vagrant user.

    That's why:

    1.

    # Create .bash_aliases
    sudo echo 'alias cls="clear"' >> ~/.bash_aliases
    

    It writes to root's ~/.bash_aliases and it is really there:

    root@vagrant:~# id
    uid=0(root) gid=0(root) groups=0(root)
    root@vagrant:~# cat .bash_aliases 
    alias cls="clear"
    

    Solution: write to vagrant's home folder:

    # Create .bash_aliases
    echo 'alias cls="clear"' >> /home/vagrant/.bash_aliases
    chown vagrant:vagrant /home/vagrant/.bash_aliases
    

    2.

    cd /vagrant
    

    This means that folder was changed in provision script, nothing else.

    Solution: add this statement to vagrant's .bash_aliases as well:

    echo 'cd vagrant' >> /home/vagrant/.bash_aliases
    

    Your final vm-setup/provision.sh is:

    # Update apt-get
    apt-get -y update
    
    # Install tree
    apt-get install tree
    
    # Create .bash_aliases
    echo 'alias cls="clear"' >> /home/vagrant/.bash_aliases
    echo 'cd /vagrant' >> /home/vagrant/.bash_aliases
    chown vagrant:vagrant /home/vagrant/.bash_aliases
    
    chsh -s $(which zsh) vagrant