Vagrant is a tool for creating and configuring lightweight, reproducible, and portable development environments. Vagrant provides a unified interface for controlling the life cycle of one or more virtual machines using the command line. Because Vagrant is platform-agnostic, you can share the same Vagrantfile with anyone; it does not matter if they are using Windows, Linux, or Mac.
Vagrant supports a number of virtualization technologies, including VirtualBox and VMware. The pluggable nature of Vagrant has allowed the community to curate support for additional virtualization technologies including Parallels, Amazon Web Services, and libvrt.
…
The second most common bug lies in the configuration of production systems, specifically the differences in configuration between production systems and development environments. Even with perfect and precision engineering, a difference in the version of a package or operating system can cause disastrous outcomes at deployment time. For this reason, there is often a push between increasing the parity between development and production environments.
Source: Vagrant: A powerful tool for configuring development environments
I think Vagrant is an under utilized tool in the development and deployment toolbox. I’ve got a good handle on code control using git but we do trip over configuration variations as we bring more boxes online in the cloud. Making sure that Apache and PHP have all the right modules loaded and same config files sounds easy enough but it really is a challenge when each instance gets built from scratch.
Relying on a single Vagrantfile to control virtual machines is a real solution to this but there is a learning curve and we do need to overcome a certain amount of organizational skepticism about using “canned” solutions for the deployment of servers. After all we’re not that far removed from the days of having to order, install, configure, and deploy physical boxes one at a time, but we need to move ahead as we shift to the cloud.