Spinning up more than one Vagrant box can be slow and tedious. Below is a solution for speeding up the
vagrant up process when you need more than one box and Docker isn’t a valid option.
Annoyingly, this solution requires a
Vagrantfile per machine, and wont work if you put loops in your
Vagrantfile. Here’s my folder structure:
. ├── Makefile └── vagrant ├── node-1 │ └── Vagrantfile ├── node-2 │ └── Vagrantfile └── node-3 └── Vagrantfile
Makefile is where the magic happens…
node-1: cd vagrant/node-1 && vagrant up node-2: cd vagrant/node-2 && vagrant up node-3: cd vagrant/node-3 && vagrant up rm-node-1: cd vagrant/node-1 && vagrant destroy -f rm-node-2: cd vagrant/node-2 && vagrant destroy -f rm-node-3: cd vagrant/node-3 && vagrant destroy -f up: node-1 node-2 node-3 destroy: rm-node-1 rm-node-2 rm-node-3
In the snippet above I create a task per node (1,2,3) and operation (up, destroy), then I create 2 wrapper tasks which calls their respective node operations. So, to start all nodes I have
up: node-1 node-2 node-3 and to destroy all nodes I have
destroy: rm-node-1 rm-node-2 rm-node-3.
If you were to call
make up from the command line you wouldnt get any benefit because Make will default to calling each task in order. However, if you call the task with the
-j flag and provide a number of executors, it will call them in parallel.
Here’s the difference in times I achieved comparing the 2 options.
make up 36.04s user 34.39s system 34% cpu 3:22.86 total
make -j3 up 30.64s user 30.38s system 78% cpu 1:17.38 total
It’s worth noting here that there’s no benefit to using a number greater than the total number of machines you’re building. It’s also worth saying this isn’t a pretty solution, but it does get the job done.