Programing

방랑 쉘 프로 비 저너에 환경 변수 전달

crosscheck 2020. 11. 1. 17:20
반응형

방랑 쉘 프로 비 저너에 환경 변수 전달


vagrant upRuby 프로비저닝 도구를 사용하는 경우 호출 할 때 환경 변수를 전달하는 것이 간단 해 보입니다 .

VAR=123 vagrant up

Vagrantfile에서 :

ENV['VAR']

:shell제공자 와 어떻게이 작업을 수행 합니까? 단순히 이렇게하면 작동하지 않는 것 같습니다.

$VAR

Vagrant 1.8.0부터 다른 답변에서 추악한 해킹을 잊을 수 있습니다. env쉘 프로 비 저너 ( docs )에 대한 옵션을 사용하십시오 .

Vagrantfile에서 다음과 같이 사용하십시오.

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

그러면 프로비저닝 스크립트에 대한 환경 만 설정됩니다. VM의 모든 프로세스에 대해 영구 환경 변수 세트가 필요한 경우 이는 Vagrant 프로비저닝의 범위를 벗어납니다. 여기를 확인하십시오. vagrant 파일의 셸 환경 변수는 처음에만 전달됩니다 .


이상적은 아니지만 지금은이 작업을 수행했습니다.

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

저는 CentOS 기반 프로비저닝을위한이 솔루션을 제공했습니다. 필요한 모든 환경 변수를 /etc/profile.d/vagrant.sh파일에 배치 한 다음 모든 프로비저닝 스크립트에서 액세스 할 수 있습니다.

요컨대 :

  $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

Complete Vagrantfile는 여기에서 찾을 수 있습니다 https://gist.github.com/bivas/6192d6e422f8ff87c29d


후손을 위해 (다시 google을 검색하는 경우) ... 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

그런 다음 스크립트에서 참조하십시오.

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

보너스 기능 :

Vagrant는 환경 변수 값에 대한 인용을 처리하지만 키는 그대로 유지됩니다.


누군가 프로비저닝 스크립트의 환경에서 변수를 설정하는 방법을 찾는 경우, 이것은 저에게 효과적이었습니다.

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

이것은 /vagrantVM에서와 같이 작업 디렉토리를 공유한다고 가정 하지만 이것이 기본값이어야합니다.


#{ENV['VAR']}인라인 스크립트 내에서 사용할 수 있습니다 . 예 :

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

작동중인 Vagrantfile에서 가져온 예입니다.

여기에는 몇 가지 단점이 있습니다. $ VAR에 작은 따옴표가 포함되어 있으면 문제가 발생합니다.


이러한 답변의 대부분은 구식 인 것 같습니다. Vagrant 2.1.1에서 이것은 나를 위해 일했습니다.

  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"

방랑-ENV의 플러그인은 정확히이 일을합니다. 이를 통해 .env파일에로드 될 로컬 디렉토리의 파일에 환경 변수를 추가 할 수 있습니다 Vagrant. 나는 유지하는 것이 좋습니다 .env당신에 .gitignore, 당신은 당신의 개인 정보 보호 보장이 이런 식으로.


작동 방식은 다음과 같습니다.

I went from using the vagrant puppet provisioner way to just using the shell provisioner. I did this mainly because I wanted to puppet not to run as root, shell provider gives you :privileged => false.

MY OLD WAY:

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

MY NEW WAY:

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

You can simply specify for shell using inlinein your Vagrantfile file:

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

Or load some extra variables from YAML file:

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)

Alternatively you may implement some optional arguments from the command line, e.g.:

# 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

then use: opt['--foo'].to_s.

See also: How to pass parameter on Vagrant up and have it in the scope of Chef cookbook?


this worked for me

VAGRANTFILE_API_VERSION = "2"

kettle_dir = ENV['KETTLE_DIR']
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
   config.vm.synced_folder kettle_dir, "/pentaho"
   config.vm.box = "ubuntu/trusty64"
end

On a ubutnu box I simply did the following in my bootstrap.sh:

echo "DBHOST=localhost" >> /etc/environment
echo "DBNAME=foo" >> /etc/environment
echo "DBUSER=root" >> /etc/environment
echo "DBPASSWD=root" >> /etc/environment

참고URL : https://stackoverflow.com/questions/19648088/pass-environment-variables-to-vagrant-shell-provisioner

반응형