diff --git a/dev/vagrant/Vagrantfile b/dev/vagrant/Vagrantfile
index d8e06c25d9..7c36613eca 100644
--- a/dev/vagrant/Vagrantfile
+++ b/dev/vagrant/Vagrantfile
@@ -57,7 +57,7 @@ NODE_SETTINGS = {
     cpus: 1,
     memory: 1024
   },
-  controller: {
+  control: {
     cpus: 1,
     memory: 2048
   },
@@ -149,67 +149,21 @@ Vagrant.configure(2) do |config|
   end
 
   if MULTINODE
-    # Build compute nodes
-    (1..NUMBER_OF_COMPUTE_NODES).each do |i|
-      config.vm.define "compute0#{i}" do |compute|
-        compute.vm.hostname = "compute0#{i}.local"
-        compute.vm.provision :shell, path: "bootstrap.sh"
-        compute.vm.synced_folder "storage/compute/", "/data/host", create:"True", type: get_default(:sync_method)
-        compute.vm.synced_folder "storage/shared/", "/data/shared", create:"True", type: get_default(:sync_method)
-        compute.vm.synced_folder ".", get_default(:vagrant_shared_folder), disabled: true
-        compute.vm.provider PROVIDER do |vm|
-          vm.memory = get_setting(:compute, :memory)
-          vm.cpus = get_setting(:compute, :cpus)
+    ['compute', 'storage', 'network', 'control'].each do |node_type|
+      (1..self.class.const_get("NUMBER_OF_#{node_type.upcase}_NODES")).each do |i|
+        hostname = "#{node_type}0#{i}"
+        config.vm.define hostname do |node|
+          node.vm.hostname = "#{hostname}.local"
+          node.vm.provision :shell, path: get_default(:provision_script), args: "#{hostname} multinode #{get_default(:kolla_path)}"
+          node.vm.synced_folder "storage/#{node_type}/", "/data/host", create:"True", type: get_default(:sync_method)
+          node.vm.synced_folder "storage/shared/", "/data/shared", create:"True", type: get_default(:sync_method)
+          node.vm.synced_folder ".", get_default(:vagrant_shared_folder), disabled: true
+          node.vm.provider PROVIDER do |vm|
+            vm.memory = get_setting(node_type.to_sym, :memory)
+            vm.cpus = get_setting(node_type.to_sym, :cpus)
+          end
+          node.hostmanager.aliases = hostname
         end
-        compute.hostmanager.aliases = "compute0#{i}"
-      end
-    end
-
-    # Build storage nodes
-    (1..NUMBER_OF_STORAGE_NODES).each do |i|
-      config.vm.define "storage0#{i}" do |storage|
-        storage.vm.hostname = "storage0#{i}.local"
-        storage.vm.provision :shell, path: "bootstrap.sh"
-        storage.vm.synced_folder "storage/storage/", "/data/host", create:"True", type: get_default(:sync_method)
-        storage.vm.synced_folder "storage/shared/", "/data/shared", create:"True", type: get_default(:sync_method)
-        storage.vm.synced_folder ".", get_default(:vagrant_shared_folder), disabled: true
-        storage.vm.provider PROVIDER do |vm|
-          vm.memory = get_setting(:storage, :memory)
-          vm.cpus = get_setting(:storage, :cpus)
-        end
-        storage.hostmanager.aliases = "storage0#{i}"
-      end
-    end
-
-    # Build network nodes
-    (1..NUMBER_OF_NETWORK_NODES).each do |i|
-      config.vm.define "network0#{i}" do |network|
-        network.vm.hostname = "network0#{i}.local"
-        network.vm.provision :shell, path: "bootstrap.sh"
-        network.vm.synced_folder "storage/network/", "/data/host", create:"True", type: get_default(:sync_method)
-        network.vm.synced_folder "storage/shared/", "/data/shared", create:"True", type: get_default(:sync_method)
-        network.vm.synced_folder ".", get_default(:vagrant_shared_folder), disabled: true
-        network.vm.provider PROVIDER do |vm|
-          vm.memory = get_setting(:network, :memory)
-          vm.cpus = get_setting(:network, :cpus)
-        end
-        network.hostmanager.aliases = "network0#{i}"
-      end
-    end
-
-    # Build control nodes
-    (1..NUMBER_OF_CONTROL_NODES).each do |i|
-      config.vm.define "control0#{i}" do |control|
-        control.vm.hostname = "control0#{i}.local"
-        control.vm.provision :shell, path: "bootstrap.sh"
-        control.vm.synced_folder "storage/control/", "/data/host", create:"True", type: get_default(:sync_method)
-        control.vm.synced_folder "storage/shared/", "/data/shared", create:"True", type: get_default(:sync_method)
-        control.vm.synced_folder ".", get_default(:vagrant_shared_folder), disabled: true
-        control.vm.provider PROVIDER do |vm|
-          vm.memory = get_setting(:controller, :memory)
-          vm.cpus = get_setting(:controller, :cpus)
-        end
-        control.hostmanager.aliases = "control0#{i}"
       end
     end
   end