Override Vagrant configuration settings locally (per-dev) Override Vagrant configuration settings locally (per-dev) ruby ruby

Override Vagrant configuration settings locally (per-dev)


The Vagrantfile is just Ruby, so YAML is another option.

For example, in the Vagrantfile I do this:

# -*- mode: ruby -*-# vi: set ft=ruby :require 'yaml'settings = YAML.load_file 'vagrant.yml'db_ip_address = settings['db']['ip_address']api_ip_address = settings['api']['ip_address']Vagrant.configure("2") do |config|  config.vm.box = "ffuenf/ubuntu-13.10-server-amd64"  config.vm.box_url = "https://vagrantcloud.com/ffuenf/ubuntu-13.10-server-amd64/version/4/provider/virtualbox.box"  config.vm.define "db" do |db|    db.vm.synced_folder settings['db']['artifacts_dir']['host'], settings['db']['artifacts_dir']['guest']    db.vm.network "private_network", ip: db_ip_address    ... other stuff ...  end  config.vm.define "api" do |api|    api.vm.synced_folder settings['api']['artifacts_dir']['host'], settings['api']['artifacts_dir']['guest']    api.vm.network "private_network", ip: api_ip_address    api.vm.network "forwarded_port", guest: settings['api']['forwarded_port']['guest'], host: settings['api']['forwarded_port']['host']  endend

Then I have a vagrant.yml file (I just made up the name; you can use whatever name you like) for the developer-specific configuration:

db:  ip_address: 192.168.4.14  artifacts_dir:    host: /Users/willie/myapp/db-scripts    guest: /opt/myapp/dbapi:  ip_address: 192.168.4.15  forwarded_port:    host: 9080    guest: 8080  artifacts_dir:    host: /Users/willie/myapp/artifacts    guest: /opt/myapp/api


I would suggest using environment variables to dynamically change the behavior of the Vagrantfile without editing the file itself.

To give a real world example, here's how you could use an Ubuntu base box by default but have an environment variable define an alternative Linux distribution:

if ENV['OPERATINGSYSTEM']  if ENV['OPERATINGSYSTEM'].downcase == 'redhat'    os_name = 'centos'    config.vm.box     = 'centos'    config.vm.box_url = 'https://dl.dropbox.com/u/7225008/Vagrant/CentOS-6.3-x86_64-minimal.box'  else    raise(Exception, "undefined operatingsystem: #{ENV['OPERATINGSYSTEM']}")  endelse  os_name = 'precise64'  config.vm.box     = 'precise64'  config.vm.box_url = 'http://files.vagrantup.com/precise64.box'end

This example comes from https://github.com/puppetlabs/puppetlabs-openstack_dev_env


If you are prepared to define settings that are applied to all your vagrant boxes it's worth noting that, "Vagrant actually loads a series of Vagrantfiles, merging the settings as it goes." (ref https://docs.vagrantup.com/v2/vagrantfile/)

So I have the following defined in ~/.vagrant.d/Vagrantfile to increase the amount of RAM for my Vagrant boxes:

Vagrant.configure(2) do |config|    config.vm.provider "virtualbox" do |vb|      vb.memory = 2048    endend