Can I force provisioning to happen before mounting shared folders in Vagrant? - vagrant

I have the following Vagrantfile:
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "centos/6"
config.vm.provision :shell, :path => "bootstrap.sh"
config.vm.network :forwarded_port, host: 8080, guest: 80
config.vm.network :forwarded_port, host: 3306, guest: 3306
config.vm.synced_folder "../../applications", "/var/www/html", :owner=>"apache", :group=>"apache"
config.vm.provider :virtualbox do |vb|
vb.customize ["modifyvm", :id, "--memory", 2048]
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
vb.name = "appserver"
end
end
Each time I run vagrant up (for first time, let's say that first I ran vagrant destroy -f) I end up with the following error:
==> default: Mounting shared folders...
default: /vagrant => E:/Development/vagrant/centos6
default: /var/www/html => E:/Development/applications/arx
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:
id -u apache
The error output from the command was:
id: apache: No such user
The error is pretty clear "apache user does not exists". As I am seeing this there is two or "three" ways to fix this:
By removing the :owner=>"apache", :group=>"apache" portion from the synced_folder. This is a BIG no, at least for me because if I remove them then the folder will be owned by vagrant which will/could cause issues while apache tries to read something from /var/www/html.
By commenting the line config.vm.synced_folder, getting up the box so everything gets installed and setup, then shutting down the box and getting up again with the line uncommented: it works but still an ugly solution
By forcing the provisioning to happen before anything gets mounted: the ideal solution.
Does any know if this is possible and if so how? I wasn't able to found anything regarding the 3rd solution :( if you have a better solution you're more than welcome to post here it might help me and others probably.
I have found this and this but is not helpful.

one potential solution would be to run apache as vagrant user.
In your /etc/httpd/conf you can replace the User and Group value as
User vagrant
Group vagrant
so you can continue sharing your folder with vagrant user and httpd will be run as vagrant user.

You can use numeric ids and then create an user
config.vm.synced_folder '${HOSTDIR}', '${EXPORTDIR}', type: "virtualbox", owner: '123', group: '456'
config.vm.provision :shell, inline: "useradd --system -g '456' -u '123' -d '${EXPORTDIR}' --shell /bin/false apache"

Related

Vagrant ssh hangs after successful boot of host

Below is my Vagrantfile, while booting up this host, it gets stuck at
==> sawtoothclient: Waiting for machine to boot. This may take a few minutes...
sawtoothclient: SSH address: 127.0.0.1:2222
sawtoothclient: SSH username: vagrant
sawtoothclient: SSH auth method: private key
Vagrant reload didnt help, I dont want to vagrant halt everytime I login on to my virtualhost.
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.define "sawtoothclient", primary: true do |sawtoothclient|
sawtoothclient.vm.box = "ubuntu/xenial64"
sawtoothclient.vm.hostname ="sawtoothclient"
sawtoothclient.vm.network :public_network
#fubuntuone.vm.provision :shell, :privileged => false, :path => "bootstrap_ubuntu.sh"
sawtoothclient.vm.synced_folder "/home/feynman/Programs/SawtoothClient/", "/home/vagrant/SawtoothClient/"
sawtoothclient.vm.provider :virtualbox do |vb|
vb.gui = false
vb.memory = 2048
#vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
#vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
end
end
end
My UFW firewall rules are
To Action From
-- ------ ----
Anywhere ALLOW 192.168.1.0/24
But when I added
sudo ufw allow 22
vagrant ssh succeeded, I couldnt understand why, From my understanding, vagrant must have been using the host machine IP to ssh into the vagrant host, which is already covered in the firewall rule added initially to the ufw firewall.
Vagrant 2.1.4
vboxmanage -v
output: 5.2.18r124319

Vagrant host to guest connection slow

I've recently checked out a project that hasn't been touched in 8 months.
On vagrant up-ing I'm finding that any connections made to the guest are ridiculously slow, for example 12 database CRUD operations are taking five minutes to execute against the database on the guest (and it's not the database operations taking the time).
I'm finding though if I ping stackoverflow from both the Windows host and the guest they're returning very similar times back.
Annoyingly there's been quite a few changes since I was last able to get this working due to the previous vagrant box not working. Changes are as follows:
Changing of the actual vagrant box from centos[6.5] to Centos/6
introduction of --natdnshostresolver1 and --natdnsproxy1 (to try fix this problem)
Addition of config.vm.synced_folder ".", "/vagrant", type: "virtualbox" (required or the vagrant up failed)
My vagrantfile is as follows:
Vagrant.configure("2") do |config|
config.vm.box = "centos/6"
config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
v.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
end
config.vm.hostname = "DEV"
config.vm.provision "shell" do |s|
s.path = "build.sh"
s.args = ["development"]
end
config.vm.synced_folder ".", "/vagrant", type: "virtualbox"
config.vm.synced_folder "../releases", "/mnt/releases"
config.vm.synced_folder "../sites", "/mnt/releases/sites"
config.vm.synced_folder "../environment/components", "/mnt/components"
config.vm.synced_folder "../environment/scripts", "/mnt/scripts"
config.vm.synced_folder "../core", "/mnt/releases/core"
config.vm.synced_folder "../controller", "/mnt/releases/controller"
config.vm.network :forwarded_port, guest: 80, host: 8000
config.vm.network :forwarded_port, guest: 3306, host: 3306
config.vm.network :forwarded_port, guest: 8080, host: 8080
config.vm.network :forwarded_port, guest: 22000, host: 22000
end
Vagrant version is 1.9.2 (downgraded from 1.9.3 and 1.9.4)
Virtual box version is 5.1.18
So after lots and lots of searching it appears the problem is with VirtualBox rather than Vagrant.
I came across many posts which say adjust the nictype in the vagrant file like such. This is to adjust the virtual networking hardware provided by virtualbox.
config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--nictype1", "82540EM"]
end
Other suggestions were virtio and AMD, this feature and settings can be read in the official documentation here: https://www.virtualbox.org/manual/ch06.html.
However
This barely did anything for me if I'm honest.
After more digging I came across this article How to speed up virtual machines in VirtualBox enormously with a simple tweak which simply put 'switch power plans to boost performance'. I was skeptical, but I run a laptop on powersaver so i'd thought I might as well give it a go. It genuinely solved the problem.

Setting vagrant home directory during provisioning

I have a VM that I'm pulling down with vagrant and using a VERY basic vagrant file
Vagrant.configure(2) do |config|
# The most common configuration options are documented and commented below.
# For a complete reference, please see the online documentation at
# https://docs.vagrantup.com.
# Every Vagrant development environment requires a box. You can search for
# boxes at https://atlas.hashicorp.com/search.
config.vm.box = "vagrant-rhel-devel"
config.vm.network :private_network, ip: "192.168.33.101"
config.vm.synced_folder ".", "/vagrant"
config.ssh.username = "vagrant"
config.ssh.password = "vagrant"
config.vm.provider "virtualbox" do |vb|
# Display the VirtualBox GUI when booting the machine
# vb.gui = true
# Enable 3d Rendering
vb.customize ["modifyvm", :id, "--accelerate3d", "on"]
# Sets 32megs video ram, higher number here = more POWERS
vb.customize ["modifyvm", :id, "--vram", "32"]
# # Customize the amount of memory on the VM:
# vb.memory = "1024"
vb.name = "RedHat 3D"
end
end
My issue is that the vagrant user gets a home directory of /localhome/vagrant and I'd like him to have /home/vagrant as the home directory.
Is this something I'm able to change with provisioning or is it something that is set in the VM itself? I'm rather unskilled at the provisioning step at the moment so an example would be great.
The HOME directory has been set when the user has been created so this was done before the VM was packaged as vagrant box.
From there, you should be able to change that with
usermod -m -d /path/to/new/home/dir userNameHere
so in your case it would be
usermod -m -d /home/vagrant vagrant
check if you have existing files under the /localhome directory that would need to be copied into the new one (bash preferences file)
if you do not plan to destroy/create a bunch of new VM from this box, its not needed to add as provisioning; if you do plan to use this box and create lot of new VM, then it could make sense, you would just need to add an inline shell provision

Failing to create SMB shared folder using Vagrant on Windows host with linux guest

I'm using Vagrant to create an Ubuntu 14.04 guest on my Windows 7 SP 1 PC. This has been working ok, but the performance of the guest is poor when accessing files that have been synchronized from the host. After doing some reading, I'm trying to make the synchronized folder an SMB share, however this is failing when I run 'vagrant up'
Note that I've upgraded to powershell 3.0, as documented in https://docs.vagrantup.com/v2/synced-folders/smb.html. I've also ensured that my guest has cifs-util installed as pointed out in https://github.com/mitchellh/vagrant/issues/4642. I'm using Vagrant 1.7.4 and VirtualBox 4.3.28
My Vagrantfile looks like this:
# -*- mode: ruby -*-
# vi: set ft=ruby :
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "npt"
config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--cpuexecutioncap", "90"]
v.customize ["modifyvm", :id, "--memory", "4096"]
v.customize ["modifyvm", :id, "--cpus", 2]
end
config.vm.synced_folder "\\", "/npt_root", type: "smb"
config.vm.provision :shell do |shell|
shell.inline = "puppet module install puppetlabs/vcsrepo --force"
end
config.vm.provision "puppet" do |puppet|
puppet.manifests_path = "puppet"
puppet.manifest_file = "basic_build_reqs.pp"
end
config.ssh.username = 'root'
config.ssh.password = 'vagrant'
config.ssh.insert_key = 'true'
end
And the output I am seeing is:
Z:\npt\vagrant>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'npt'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: vagrant_default_1442502969737_66801
==> default: Preparing SMB shared folders...
default: You will be asked for the username and password to use for the SMB
default: folders shortly. Please use the proper username/password of your
default: Windows account.
default:
default: Username: tdj#DCL
default: Password (will be hidden):
Exporting an SMB share failed! Details about the failure are shown
below. Please inspect the error message and correct any problems.
Host path: Z:/
Stderr: System error 123 has occurred.
The filename, directory name, or volume label syntax is incorrect.
Error:
Stdout:
It looks like Vagrant has interpreted the relative path "\" I've given it and is coming up with "Z:/", with unix style slashes, which Windows is then failing to parse.
Note that I've tried replacing the relative path with the absolute path "Z:\", but I still see the same output on the "Host path" line
I suspect "\\" is the problem in the following line:
config.vm.synced_folder "\\", "/npt_root", type: "smb"
Could you try to put in a concrete foldername that you would like to share with your VM and test if it works?

How to enable internet access inside Vagrant?

If I run curl google.com, I can't see the output, only a blank page. My Vagrantfile contains:
Vagrant.configure("2") do |config|
config.vm.box = "trumobi"
#config.vm.box_url = "http://192.168.136.129/package.box"
config.ssh.default.username = "trumobi"
config.vm.network :public_network
config.vm.network :forwarded_port, host: 8000, guest: 8000
end
If you are using Vagrant + VirtualBox + Ubuntu, you might want to add the following block to your VagrantFile:
config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
v.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
end
If you are using ubuntu, and you think your firewall is on, here's how you turn off the firewall:
sudo ufw disable
This happens sometimes for me if I switch the host network connection, like disconnecting my laptop Ethernet cable and start using the wireless network.
I found that rebooting the Vagrant vm (vagrant halt, vagrant up) fixes things.
Disabling firewall helped me.
In my CentOS guest box I did:
# sudo service iptables save
# sudo service iptables stop
# sudo chkconfig iptables off
I tried all of the above without success (Vagrant+Virtualbox+Ubuntu 14.04). Virtualbox was showing 'Adapter 1 (NAT): cable disconnected'. Adding the following to my Vagrantfile fixed it:
config.vm.provider 'virtualbox' do |vb|
vb.customize ['modifyvm', :id, '--cableconnected1', 'on']
end
Found here: https://github.com/mitchellh/vagrant/issues/7648

Resources