web-dev-qa-db-fra.com

Transmettre les variables d'environnement au fournisseur de Shell vagabond

Il semblerait que transmettre des variables d'environnement lors de l'appel de vagrant up est simple si vous utilisez un provisioner Ruby:

VAR=123 vagrant up

Dans le fichier Vagrant:

ENV['VAR']

Comment est-ce que je fais ceci avec le provisioner :Shell? Cela ne semble pas fonctionner:

$VAR
64
Abdullah Jibaly

Ce n'est pas l'idéal, mais je dois travailler pour le moment:

config.vm.provision "Shell" do |s|
    s.inline = "VAR1 is $1 and VAR2 is $2"
    s.args   = "#{ENV['VAR1']} #{ENV['VAR2']}"
end
40
Abdullah Jibaly

Depuis Vagrant 1.8.0 vous pouvez oublier les horribles bidouilles des autres réponses ici. Utilisez simplement l'option env pour le fournisseur de shell ( docs ).

Utilisez-le comme ceci dans votre Vagrantfile:

config.vm.provision "Shell", path: "provisionscript.sh", env: {"MYVAR" => "value"}

Cela définira l'environnement pour le script d'approvisionnement uniquement. Si vous avez besoin d'un ensemble de variables d'environnement persistant pour tous les processus de la machine virtuelle, le provisioning Vagrant est hors de portée et regardez ici: Les variables d'environnement shell dans les fichiers vagants sont uniquement transmises en premier .

58
gertvdijk

Je suis venu avec cette solution pour le provisioning basé sur CentOS: plaçant toutes mes variables d’environnement requises dans un fichier /etc/profile.d/vagrant.sh, puis il est accessible dans n’importe quel script de provision.

en bref:

  $before_script = <<SCRIPT
  echo # vagrant profile script > /etc/profile.d/vagrant.sh
  echo export ENV_VAR1=foo.com/bar >> /etc/profile.d/vagrant.sh
  echo export ENV_VAR2=bar.com/foo >> /etc/profile.d/vagrant.sh
  chmod +x /etc/profile.d/vagrant.sh
SCRIPT

  $after_script = <<SCRIPT
    rm -rf /etc/profile.d/vagrant.sh
SCRIPT

  config.vm.provision "Shell", inline: $before_script
  config.vm.provision "Shell", path: "build.sh"
  config.vm.provision "Shell", inline: $after_script

Vous trouverez ici Vagrantfile complet https://Gist.github.com/bivas/6192d6e422f8ff87c29d

14
Bivas

Pour la postérité (c'est-à-dire si je la recherche à nouveau sur Google) ... Il est possible de transmettre des paires clé-valeur via env ​​ :

box.vm.provision :Shell do |s|
  s.env = {AWS_ACCESS_KEY:ENV['AWS_ACCESS_KEY'], AWS_SECRET_KEY:ENV['AWS_SECRET_KEY']}
  s.path = 'scripts/bootstrap.sh'
end

Ensuite, référencez-les dans votre script:

export AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY}
export AWS_SECRET_ACCESS_KEY=${AWS_SECRET_KEY}

Bonus:

Vagrant gérera les guillemets pour les valeurs de variables d’environnement, mais le les touches restent intactes

12
Al Belsky

Si quelqu'un finissait par chercher comment définir des variables dans l'environnement du script d'approvisionnement, cela fonctionnait pour moi.

config.vm.provision :Shell, :inline => <<-SH
  export GRAPHITE_Host=192.168.33.10
  /vagrant/install_app_with_monitoring.sh
SH

Notez que cela suppose que vous partagez votre répertoire de travail sous la forme /vagrant sur le VM, mais il devrait s'agir du répertoire par défaut.

6
Mat Schaffer

Vous pouvez utiliser #{ENV['VAR']} dans un script en ligne, par exemple:

config.vm.provision "Shell", inline: <<-END
  ...
  # Install my dotfiles are there.  If you're in a hurry you can do
  # SKIP_DOTFILES=1 vagrant up
  if ! [ -d /home/vagrant/dotfiles ] && [ -z '#{ENV['SKIP_DOTFILES']}']; then
    if ! [ -x /usr/bin/git ]; then
      DEBIAN_FRONTEND=noninteractive apt-get install -y git
    fi
    su - vagrant -c 'git clone https://github.com/mgedmin/dotfiles'
    su - vagrant -c 'dotfiles/install.sh'
  fi
  ...
  END

Exemple tiré d'un fichier Vagrant actif.

Cela a quelques inconvénients: si $ VAR contient des guillemets simples, les choses vont se casser.

4
Marius Gedminas

La plupart de ces réponses semblent être dépassées. Avec Vagrant 2.1.1, cela a fonctionné pour moi:

  VAGRANTFILE_API_VERSION = "2" //...

  machine.vm.provision "Shell", 
    env: {
      "ELASTIC_XMS" => servers["elastic"]["memory_xms"], 
      "ELASTIC_XMX" => servers["elastic"]["memory_xmx"]
    }, 
    inline: "sed -i -e \"s/-Xms.*/$ELASTIC_XMS/g\" /etc/elasticsearch/jvm.options"
2
OZZIE

Le vagrant-env plugin fait exactement cela. Avec cela, vous pouvez ajouter des variables d’environnement au fichier .env du répertoire local qui sera chargé dans le fichier Vagrant. Je suggère de garder .env dans votre .gitignore, afin que votre vie privée soit garantie. 

1
Shairon Toledo

Vous pouvez simplement spécifier pour Shell en utilisant inlinedans votre fichier Vagrantfile:

config.vm.provision "Shell", inline: %Q(/usr/bin/env FOO=1 BAR=1 bash /path/to/script.sh)

Ou chargez des variables supplémentaires à partir du fichier YAML:

require 'yaml'
dir = File.dirname(File.expand_path(__FILE__))
vconfig = YAML::load_file("#{dir}/config.yml")
config.vm.provision "Shell", inline: %Q(/usr/bin/env FOO=#{vconfig['foo']} bash /path/to/script.sh)

Vous pouvez également implémenter certains arguments facultatifs à partir de la ligne de commande, par exemple:

# Parse optional arguments.
opts = GetoptLong.new(
  [ '--foo',  GetoptLong::OPTIONAL_ARGUMENT ], # With optional parameter.
  [ '--bar',  GetoptLong::OPTIONAL_ARGUMENT ], # With optional parameter.files.
)
opts.each do |opt, arg|
  case opt
    when '--foo'
      foo==arg
    when '--bar'
      bar=arg
  end
end

puis utilisez: opt['--foo'].to_s.

Voir aussi: Comment passer le paramètre sur Vagrant et le placer dans le champ du livre de recettes Chef?

0
kenorb

Voici comment je le fais fonctionner.

Je suis passé de la méthode du proviseur de marionnettes vagabond à celui du ravitailleur Shell. Je l'ai fait principalement parce que je voulais que marionnette ne s'exécute pas en tant que root. Le fournisseur Shell vous donne: privileged => false.

Ma vieille manière: 

config.vm.provision :puppet do |puppet|
  puppet.module_path = ENV.fetch('MODULES_PATH', 'modules')
  puppet.manifests_path = ENV.fetch('MANIFESTS_PATH', 'manifests')
  puppet.manifest_file  = ENV.fetch('MANIFEST_FILE', 'site.pp')
  puppet.options = "--debug"
end

MON NOUVEAU CHEMIN:

config.vm.provision :Shell, :privileged => false do |Shell|
  Shell.inline = "puppet apply --debug --modulepath '/vagrant/#{ENV.fetch('MODULES_PATH', 'modules')}' --detailed-exitcodes '/vagrant/#{ENV.fetch('MANIFESTS_PATH', 'manifests')}/#{ENV.fetch('MANIFEST_FILE', 'site.pp')}'"
end
0
Kuberchaun