58 votes

Remplacer les paramètres de configuration Vagrant localement (par dev)

J'aimerais répondre à la question, en général, mais pour l'illustrer, voici un cas d'utilisation:

Je suis l'aide de l'Errance pour un simple LMAP projet. J'ai une utilisation autonome de la Marionnette pour l'approvisionnement. Maintenant, il pourrait y avoir quelques développeurs qui sont assis derrière un proxy et qu'ils auraient besoin d'une configuration supplémentaire pour être fait à la machine virtuelle. J'ai des choses à travailler sur la Marionnette côté: je peux passer le proxy IP (le cas échéant) comme un fait de la marionnette dans l' Vagrantfile poupées et réagit en conséquence s'il est défini.

Le seul problème que j'ai est la suivante: comment les développeurs peuvent-ils préciser/modifier ce paramètre pour leur environnement de développement sans avoir à changer l' Vagrantfile (ce qui est sous contrôle de version, et doit demeurer, dev-environnement-neutre)?

Si serait génial si les gens pouvaient remplacer certains Vagrant paramètres dans un fichier appelé par exemple, Vagrantfile.local, ce qui est je exclure .gitignore.

Depuis un Vagrantfile est juste Ruby, j'ai essayé le suivant:

# Also load per-dev custom vagrant config
custom_vagrantfile = 'Vagrantfile.local'
load custom_vagrantfile if File.exist?(custom_vagrantfile)

L'inclusion de fichier fonctionne, mais il semble que dans le fichier inclus, je ne suis pas dans le même Vagrant contexte plus...

Vagrant::Config.run do |config|
  config.vm.provision :puppet do |puppet|
    puppet.facter = { "proxy" => "proxy.host:80" }
  end
end

... aussi "réinitialise" tous les autres marionnettes config valeurs que j'ai fait dans le principal Vagrantfile, ce qui me fait penser que je me dirige dans la mauvaise direction ici. Je dois souligner que je suis un noob total en Ruby ;)

Quelqu'un peut-il me donner un indice ou même une solution de travail pour comment par-dev personnalisation pourrait être fait ici en général?

91voto

Willie Wheeler Points 8632

Le Vagrantfile est juste Ruby, alors YAML est une autre option.

Par exemple, dans les Vagrantfile je fais ceci:

 # -*- 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
 

Ensuite, j'ai un fichier vagrant.yml (je viens de composer le nom; vous pouvez utiliser le nom de votre choix) pour la configuration spécifique au développeur:

 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
 

28voto

Philip Durbin Points 1943

Je voudrais suggérer à l'aide de variables d'environnement pour modifier dynamiquement le comportement de l' Vagrantfile sans modifier le fichier lui-même.

Pour donner un exemple concret, voici comment vous pouvez utiliser une Ubuntu de base à cocher par défaut, mais ont une variable d'environnement à définir une alternative distribution Linux:

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

Cet exemple vient de https://github.com/puppetlabs/puppetlabs-openstack_dev_env

12voto

user2045006 Points 359

Si vous êtes prêt à définir des paramètres qui s'appliquent à toutes vos boîtes vagabondes, il convient de noter que "Vagrant charge en fait une série de fichiers Vagrantfile, en les fusionnant au fur et à mesure". (réf. https://docs.vagrantup.com/v2/vagrantfile/ )

J'ai donc les éléments suivants définis en ~/.vagrant.d/Vagrantfile pour augmenter la quantité de RAM de mes boîtes Vagrant:

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

6voto

Sergio Tulentsev Points 82783

Voici une idée. Il peut être "laid" et "mauvais", mais, au moins, ça fonctionne :)

# file2.rb, this is your per-dev configuration file
puts "included external file which uses outer var: #{foo}"

# file1.rb, this would be your Vagrantfile
puts 'first'
foo = 'bar'

external = File.read 'file2.rb'
eval external
puts 'second'

Arrêtons-nous que

$ ruby file1.rb
first
included external file which uses outer var: bar
second

S'adapter à votre exemple, fichier2.rb ne contiendra que l'utilisation de l' config sans le définir (config sera assurée à partir du contexte externe)

  config.vm.provision :puppet do |puppet|
    puppet.facter = { "proxy" => "proxy.host:80" }
  end

Et votre Vagrant fichier peut ressembler à ceci:

Vagrant::Config.run do |config|
  external = File.read 'Vagrantfile.local'
  eval external

  # proceed with general settings here
  config.vm.provision :puppet do |puppet|
    puppet.facter = { "proxy" => "proxy.host:80" }
  end
end

Mise à jour (une autre "data-driven" approche)

# Vagranfile.local
config_values[:puppet][:facter][:proxy] = 'proxy.host:80'

# Vargantfile
Vagrant::Config.run do |config|
  config_values = {
    puppet: {
      facter: {
        proxy: nil
      },
      manifests_file: 'my_manifest.pp'

    }
  }
  external = File.read 'Vagrantfile.local'
  eval external # this should overwrite proxy config

  # proceed with general settings here
  config.vm.provision :puppet do |puppet|
    if config_values[:puppet][:facter][:proxy]
      puppet.facter = { "proxy" => config_values[:puppet][:facter][:proxy] } 
    end

    puppet.manifests_file = config_values[:puppet][:manifests_file]
  end
end

5voto

Amr Mostafa Points 5751

Je crois que c'est exactement le cas d'utilisation que Nugrant plugin a été créé pour résoudre. Il permet à chacun de vos devs d'avoir un .vagrantuser (ce qui est une .gitignore-ed fichier) en YAML spécifiant des valeurs de configuration puis de référence de ces valeurs avec la facilité en Vagrantfile.

Dans votre cas, un proxy développeur aurait leur .vagrantuser le fichier comme ceci:

proxy: 'proxy.host:80'

Et votre Vagrantfile devrait ressembler à ceci (le pseudo-code, je ne sais pas vraiment 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

Vous devriez bundle un échantillon de référence/vagrantuser (c - vagrantuser.example) de fichier pour votre devs de copier et de s'adapter à leur environnement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X