Vagrant manages the machine you are creating for your project, the connection and port forwarding so you can communicate with it, but its just a blank Unix box. A blank box is fine if you want to install the software by hand and then configure it yourself, however what happens if you loose the box for whatever reason, and the software must be installed again? Ok, so now do this a few times and it will definitely be the dullest part of your day. This is where provisioning comes in, a provisioner allows you to automate the process of setting up your Vagrant box (or any computer / server), by telling Vagrant what software you require and how you require it to be configured, you can build box after box exactly the same on any machine. So if you are configuring your box for a project, anyone who has the config files and provisioning, will have exactly the same setup no matter what individual machine setup they use, this is the power of Vagrant.
Provisioners allow you to easily setup your virtual machine with everything it needs to run your software.
Vagrants provisioning comes in a number of different forms, Chef Solo, Puppet and Shell. These three solutions have their quirks and idiosyncrasies so you may fine you prefer one over another. Each uses different syntax and terminology, Chef and Puppet using their own pseudo-languages and Shell being raw Unix Shell commands.
Leaving “Shell” for a minute, the other two, Chef and Puppet do share some attributes. They both provide the ability to download packages, Cookbooks for Chef and Manifests for Puppet. These packages are a combination of open source community efforts and the organisations putting time and effort into making many of the most popular server software available for their platforms. Both provisioners allow you to set up and order the installation of software however the method by which they do this is distinct.