chef-infravagrantberkshelf

How to run a chef recipe after vagrant box provisioned


I'm using Vagrant + Berkshelf + Chef Solo to mirror behavior of my production AWS OpsWorks boxes on my development machine.

I can get the vagrant box up just fine, but now, after it has been provisioned, I want to be able to run a different Chef recipe from the cookbooks used during provisioning. I want to do this because I'm trying to emulate OpsWorks' behavior: they let me run a deploy recipe with the push of a button. I want to be able to either use vagrant or chef-solo inside my vagrant box to run that same recipe.

I think I can solve this by adding a recipe to the provisioning process that builds up different solo.rb config files for the different on-demand recipes I want to run. These config files would point to the Vagrant/Berkshelf cookbooks_path (which is /tmp/vagrant-chef-1/ for me) and then set the run list to the appropriate recipe. These config files would then be used by chef-solo.

I get the feeling that someone has solved this problem before in a more elegant way. Is there a better way to do this?

If not, does anyone know a way from within Vagrant or within a recipe to find the cookbook path so I don't have to hardcode /tmp/vagrant-chef-1/ into my solo.rb config files?


Solution

  • You can just add multiple provisioners. So after your first config.vm.provision :chef_solo block just add another one applying the recipe you want to run after the first deployment.