Search code examples
vagrantchef-infraprovisioningvagrantfile

Vagrant Multi VM: provision each based on condition


How do I tell vagrant to provision based on condition? I am spinning up multi VMs under a loop

Vagrantfile:

   Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
     # Iterate through entries in YAML file
     servers.each do |servers|
       config.vm.define servers["name"] do |srv|
         srv.vm.hostname = servers["name"] + DOMAIN
         srv.vm.box = servers["box"]
         srv.vm.network "private_network", ip: servers["ip"]
         srv.vm.synced_folder ".", "/data", id: "mapping", disabled: servers["share"]
         srv.vm.provider :virtualbox do |vb|
           vb.memory = servers["ram"]
           vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
         end
       end
    end
  end

I want to add something like this:

    servers.each do |servers|
       config.vm.define servers["name"] do |srv|
         srv.vm.hostname = servers["name"] + DOMAIN
         srv.vm.box = servers["box"]
         srv.vm.network "private_network", ip: servers["ip"]
         srv.vm.synced_folder ".", "/data", id: "mapping", disabled: servers["share"]
         srv.vm.provider :virtualbox do |vb|
           vb.memory = servers["ram"]
           vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
         end
         if servers["name"] == "server1"
           config.vm.provision :chef_solo do |chef|
             chef.cookbooks_path = "#{cookbooks}"
             chef.add_recipe "chef_blah::server"
           end
         else
           puts("Skipping it...")
         end
      end
    end

But every time it executes the provision block on all the VMs


Solution

  • That should be srv.vm.provision, i.e. you are defining it on only that server not the root Vagrant config.