3
votes

I am trying to spin up 3 VMs from the same Vagrant Base Box. However, only 2 VMs get created. This is due to the fact that the shell provisioner script gets executed twice during the provisioning of the second VM. As a result the process is terminated with the errors detailed below.

Here is my Vagrantfile:

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

#The box name and the URL to Retrieve the Vagrant Box from
  config.vm.box = "eFx-Dev"
  config.vm.box_url = "http://web/provisioning/vagrant-boxes/centos7-basev0.1.box"
  config.ssh.insert_key = false


#Creating the first Dev Machine
#With network address being assigned via DHCP
#and bootstraped via a shell script.
#This script can be unique for each machine.
#But at the moment they are bootstarpped the same.
#The spects of the machine.
#Can be adjusted based on requirements.
  config.vm.define "eFxDev1" do |eFxDev1|
        eFxDev1.vm.hostname = "eFxDev1"
        eFxDev1.vm.box = "eFx-Dev"
        config.vm.network "public_network", type: "dhcp"
        config.vm.provision "shell", path: "vmscripts/bootstrap.sh"
        config.vm.provider "virtualbox" do |vb|
                vb.name = "eFx-Dev1"
                vb.memory = "10124"
                vb.customize ["modifyvm", :id, "--cpus", 4]
  end
end

  config.vm.define "eFxDev2" do |eFxDev2|
        eFxDev2.vm.hostname = "eFxDev2"
        eFxDev2.vm.box = "eFx-Dev"
        config.vm.network "public_network", type: "dhcp"
        config.vm.provision "shell", path: "vmscripts/bootstrap.sh"
        config.vm.provider "virtualbox" do |vb|
                vb.name = "eFx-Dev2"
                vb.memory = "10124"
                vb.customize ["modifyvm", :id, "--cpus", 4]
  end
end

  config.vm.define "eFxDev3" do |eFxDev3|
        eFxDev3.vm.hostname = "eFxDev3"
        eFxDev3.vm.box = "eFx-Dev"
        config.vm.network "public_network", type: "dhcp"
        config.vm.provision "shell", path: "vmscripts/bootstrap.sh"
        config.vm.provider "virtualbox" do |vb|
                vb.name = "eFx-Dev3"
                vb.memory = "10124"
                vb.customize ["modifyvm", :id, "--cpus", 4]
  end
 end
end

The first VM gets deployed by running the provisioner shell ONCE. The VM Boots up and Vagrant moves on to create the second VM:

==> eFxDev1: Importing base box 'eFx-Dev'...
==> eFxDev1: Matching MAC address for NAT networking...
...
==> eFxDev1: Running provisioner: shell...
    eFxDev1: Running: /tmp/vagrant-shell20170201-60595-wpa6qn.sh
==> eFxDev1: + yum install dos2unix -y --disableplugin=fastestmirror
==> eFxDev1: + sudo groupadd Efx
==> eFxDev1: groupadd: group 'Efx' already exists
...

The Second VM is deployed but for some reason runs the provisioner script TWICE and fails:

==> eFxDev2: Importing base box 'eFx-Dev'...
==> eFxDev2: Matching MAC address for NAT networking...
...
==> eFxDev2: Running provisioner: shell...
    eFxDev2: Running: /tmp/vagrant-shell20170201-60595-1fwit5t.sh
==> eFxDev2: + yum install dos2unix -y --disableplugin=fastestmirror
==> eFxDev2: + sudo groupadd Efx
==> eFxDev2: groupadd: group 'Efx' already exists
...
==> eFxDev2: Running provisioner: shell...
    eFxDev2: Running: /tmp/vagrant-shell20170201-60595-1mu7y6h.sh
==> eFxDev2: + yum install dos2unix -y --disableplugin=fastestmirror
==> eFxDev2: Nothing to do
==> eFxDev2: + sudo groupadd Efx
==> eFxDev2: groupadd: group 'Efx' already exists
The SSH command responded with a non-zero exit status. Vagrant
assumes that this means the command failed. The output for this command
should be in the log above. Please read the output to determine what

As a result the process fails and the third VM does not get provisioned. Why is the provision script run twice?

1

1 Answers

5
votes

Its because you're mixing config and the specific machine variable.

Any methods applied to config.vm will apply to ALL your machines (even if you put it in a specific machine block) so its better to put all your config.vm properties outside of any specific machine block, you could rewrite your script as

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

#The box name and the URL to Retrieve the Vagrant Box from
config.vm.box = "eFx-Dev"
config.vm.box_url = "http://web/provisioning/vagrant-boxes/centos7-basev0.1.box"
config.ssh.insert_key = false
config.vm.network "public_network", type: "dhcp"


#Creating the first Dev Machine
#With network address being assigned via DHCP
#and bootstraped via a shell script.
#This script can be unique for each machine.
#But at the moment they are bootstarpped the same.
#The spects of the machine.
#Can be adjusted based on requirements.
config.vm.define "eFxDev1" do |eFxDev1|
  eFxDev1.vm.hostname = "eFxDev1"
  eFxDev1.vm.provision "shell", path: "vmscripts/bootstrap.sh"
  eFxDev1.vm.provider "virtualbox" do |vb|
          vb.name = "eFx-Dev1"
          vb.memory = "10124"
          vb.customize ["modifyvm", :id, "--cpus", 4]
  end
end

config.vm.define "eFxDev2" do |eFxDev2|
  eFxDev2.vm.hostname = "eFxDev2"
  eFxDev2.vm.box = "eFx-Dev"
  eFxDev2.vm.provision "shell", path: "vmscripts/bootstrap.sh"
  eFxDev2.vm.provider "virtualbox" do |vb|
          vb.name = "eFx-Dev2"
          vb.memory = "10124"
          vb.customize ["modifyvm", :id, "--cpus", 4]
  end
end

config.vm.define "eFxDev3" do |eFxDev3|
  eFxDev3.vm.hostname = "eFxDev3"
  eFxDev3.vm.box = "eFx-Dev"
  eFxDev3.vm.provision "shell", path: "vmscripts/bootstrap.sh"
  eFxDev3.vm.provider "virtualbox" do |vb|
          vb.name = "eFx-Dev3"
          vb.memory = "10124"
          vb.customize ["modifyvm", :id, "--cpus", 4]
  end
 end
end