it-swarm.com.de

Übergeben Sie Umgebungsvariablen an den Vagabestellungs-Provisioner von Shell

Das Übergeben von Umgebungsvariablen beim Aufruf von vagrant up ist anscheinend einfach, wenn Sie einen Ruby-Bereitsteller verwenden:

VAR=123 vagrant up

In der Vagrantfile:

ENV['VAR']

Wie mache ich das mit dem :Shell Provisioner? Einfach das zu tun scheint nicht zu funktionieren:

$VAR
64
Abdullah Jibaly

Es ist nicht ideal, aber ich habe das jetzt erstmal zum Laufen gebracht:

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

Seit Vagrant 1.8.0 kannst du die hässlichen Hacks aus den anderen Antworten hier vergessen. Verwenden Sie einfach die Option env für den Shell-Provisioner ( docs ).

Verwenden Sie es wie folgt in Ihrer Vagrantfile:

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

Dadurch wird nur die Umgebung für das Bereitstellungsskript festgelegt. Wenn Sie eine permanente Umgebungsvariable für alle Prozesse in der VM festlegen möchten, ist dies für Vagrant-Provisioning nicht möglich. Sehen Sie hier: Shell-Umgebungsvariablen in Vagrant-Dateien werden nur zuerst weitergegeben .

58
gertvdijk

Ich kam mit dieser Lösung für CentOS-basiertes Provisioning: Ich platzierte alle erforderlichen Umgebungsvariablen in der /etc/profile.d/vagrant.sh-Datei und greift dann in jedem Provisioning-Skript auf.

zusamenfassend:

  $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

Die vollständige Vagrantfile finden Sie hier https://Gist.github.com/bivas/6192d6e422f8ff87c29d

14
Bivas

Für die Nachwelt (alias falls ich es noch einmal google) ... Es ist möglich, Schlüsselwertpaare über env ​​ zu übergeben:

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

Dann verweisen Sie sie in Ihrem Skript:

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

Bonusfunktion:

Vagrant übernimmt die Anführungszeichen für Umgebungsvariablenwerte, aber die Schlüssel bleiben unberührt

12
Al Belsky

Wenn jemand am Ende nach dem Festlegen von Variablen in der Umgebung des Bereitstellungsskripts sucht, hat dies für mich funktioniert.

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

Beachten Sie, dass Sie davon ausgehen, dass Sie Ihr Arbeitsverzeichnis als /vagrant auf VM freigeben. Dies sollte jedoch der Standard sein.

6
Mat Schaffer

Sie können #{ENV['VAR']} in einem Inline-Skript verwenden, z.

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

Beispiel aus einer funktionierenden Vagrantfile.

Dies hat einige Nachteile: Wenn $ VAR einfache Anführungszeichen enthält, werden die Dinge kaputt gehen.

4
Marius Gedminas

Die meisten dieser Antworten scheinen veraltet zu sein. Mit Vagrant 2.1.1 hat das für mich funktioniert:

  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

Das vagrant-env plugin macht genau das. Damit können Sie Umgebungsvariablen zu .env-Datei im lokalen Verzeichnis hinzufügen, die in Vagrant-Datei geladen werden. Ich schlage vor, .env in Ihrem .gitignore zu behalten. Auf diese Weise haben Sie Ihre Privatsphäre garantiert. 

1
Shairon Toledo

Sie können einfach Shell mit inline in Ihrer Vagrantfile-Datei angeben:

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

Oder laden Sie einige zusätzliche Variablen aus der YAML-Datei:

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)

Alternativ können Sie einige optionale Argumente von der Befehlszeile aus implementieren, z. B .:

# 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

dann verwenden Sie: opt['--foo'].to_s.

Siehe auch: Wie übergebe ich Parameter auf Vagrant und habe sie im Rahmen des Chef-Kochbuchs?

0
kenorb

So funktioniert es.

Ich habe mich vom Vagabund-Marionetten-Provisioner auf den Shell-Provisioner beschränkt. Ich habe dies hauptsächlich gemacht, weil ich wollte, dass Marionette nicht als Root ausgeführt wird. Der Shell-Anbieter gibt Ihnen Folgendes: privileged => false.

MEIN ALTER WEG: 

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

MEIN NEUER WEG:

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