Override Vagrant configuration settings locally (per-dev)

前端 未结 8 1280
说谎
说谎 2021-01-30 02:51

I\'d like the question to be answered in general, but to illustrate it, here\'s a use case:

I\'m using Vagrant for a simple LMAP project. I use standalone Puppet for pro

相关标签:
8条回答
  • 2021-01-30 03:33

    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
        end
    end
    
    0 讨论(0)
  • 2021-01-30 03:37

    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']
      end
    end
    

    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/db
    
    api:
      ip_address: 192.168.4.15
      forwarded_port:
        host: 9080
        guest: 8080
      artifacts_dir:
        host: /Users/willie/myapp/artifacts
        guest: /opt/myapp/api
    
    0 讨论(0)
  • 2021-01-30 03:37

    To extend on @Willie Wheeler 's answer. My setup is:

    Root
    |-- defaults.yml
    |-- env.yml
    |-- Vagrantfile
    

    Vagrantfile

    # Load local env config
    require 'yaml'
    dir = File.dirname(File.expand_path(__FILE__))
    
    # defaults
    settings = YAML::load_file("#{dir}/defaults.yml")
    
    if File.exist?("#{dir}/env.yml")
        env_settings = YAML::load_file("#{dir}/env.yml")
        settings.merge!(env_settings)
    end
    ...
    # Customize the amount of memory on the VM:
        vb.memory = settings["vb"]["memory"]
    

    defaults.yml

    vb:
      memory: 1024
    

    env.yml

    vb:
      memory: 204
    

    This will merge whatever defaults you have with your per-dev config. Also it is clear to developers what values they can actually change

    0 讨论(0)
  • 2021-01-30 03:40

    You can load the settings from YAML file. This is demonstrated in Drupal VM as below:

    # Use config.yml for basic VM configuration.
    require 'yaml'
    dir = File.dirname(File.expand_path(__FILE__))
    if !File.exist?("#{dir}/config.yml")
      raise 'Configuration file not found! Please copy example.config.yml to config.yml and try again.'
    end
    vconfig = YAML::load_file("#{dir}/config.yml")
    

    So then you can create config.yml like:

    vagrant_box: geerlingguy/ubuntu1404
    vagrant_user: vagrant
    vagrant_ip: 192.168.88.88
    

    and in Vagrantfile you can use variables as:

    config.vm.box = vconfig['vagrant_box']
    config.vm.network "private_network", ip: vconfig['vagrant_ip']
    
    0 讨论(0)
  • 2021-01-30 03:42

    I believe that's the exact use case that Nugrant plugin was created to solve. It allows each of your devs to have a .vagrantuser (which is a .gitignore-ed file) in YAML specifying custom configuration values then reference these values with ease in Vagrantfile.

    In your case, a proxied developer would have their .vagrantuser file looking like this:

    proxy: 'proxy.host:80'
    

    And your Vagrantfile would look like this (pseudo code, I don't really know ruby):

    Vagrant::Config.run do |config|
      config.vm.provision :puppet do |puppet|
        if config.user.has_key?('proxy')
          puppet.facter = { "proxy" => config.user.proxy }
        end
      end
    end
    

    You should bundle a sample/reference vagrantuser (i.e. vagrantuser.example) file for your devs to copy and adjust to their environment.

    0 讨论(0)
  • 2021-01-30 03:48

    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']}")
      end
    else
      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

    0 讨论(0)
提交回复
热议问题