방랑 쉘 프로 비 저너에 환경 변수 전달
vagrant up
Ruby 프로비저닝 도구를 사용하는 경우 호출 할 때 환경 변수를 전달하는 것이 간단 해 보입니다 .
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
이것은 /vagrant
VM에서와 같이 작업 디렉토리를 공유한다고 가정 하지만 이것이 기본값이어야합니다.
#{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 inline
in 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
'Programing' 카테고리의 다른 글
QImage와 QPixmap의 차이점은 무엇입니까? (0) | 2020.11.01 |
---|---|
Redirect() vs RedirectPermanent() in ASP.NET MVC (0) | 2020.11.01 |
matplotlib 막대 차트에 값 레이블 추가 (0) | 2020.11.01 |
각 단어의 첫 글자를 얻다 (0) | 2020.10.31 |
SBT는 로컬 Maven 저장소에서 파일을 찾지 못합니다. (0) | 2020.10.31 |