Vagrant 구성 설정을 로컬로 재정의 (개발자 별)
일반적으로 질문에 대한 답변을 받고 싶지만이를 설명하기 위해 다음과 같은 사용 사례가 있습니다.
간단한 LMAP 프로젝트에 Vagrant를 사용하고 있습니다. 프로비저닝을 위해 독립 실행 형 Puppet을 사용합니다. 이제 프록시 뒤에 앉아있는 개발자가있을 수 있으며 VM에 대한 추가 구성이 필요합니다. Puppet 측에서 작업하는 것이 있습니다. 프록시 IP (있는 경우)를 puppet에 사실로 전달할 수 Vagrantfile있으며 Puppet이 설정되면 그에 따라 반응합니다.
내가 가진 유일한 문제는 개발자가 변경하지 않고도 개발 환경에 대해이 설정을 지정 / 재정의 할 수 Vagrantfile있다는 것입니다 (버전 제어하에 있고 dev-environment-neutral로 유지되어야 함)?
만약 사람들이 eg라는 파일에서 일부 Vagrant 설정을 무시할 수 있다면 굉장 할 Vagrantfile.local것 .gitignore입니다.
Vagrantfile은 Ruby 일 뿐이므로 다음을 시도했습니다.
# Also load per-dev custom vagrant config
custom_vagrantfile = 'Vagrantfile.local'
load custom_vagrantfile if File.exist?(custom_vagrantfile)
파일 포함은 기본적으로 작동하지만 포함 된 파일처럼 보이지만 더 이상 동일한 Vagrant 컨텍스트에 있지 않습니다.
Vagrant::Config.run do |config|
config.vm.provision :puppet do |puppet|
puppet.facter = { "proxy" => "proxy.host:80" }
end
end
... 또한 내가 main에서 만든 다른 모든 꼭두각시 구성 값을 "재설정" Vagrantfile하여 여기에서 잘못된 방향으로 가고 있다고 생각하게합니다. 나는 Ruby에서 완전히 멍청하다는 것을 알아야합니다.)
누구든지 여기에서 일반적으로 개발자 별 사용자 정의를 수행 할 수있는 방법에 대한 힌트 또는 작업 솔루션을 줄 수 있습니까?
환경 변수를 사용 Vagrantfile하여 파일 자체를 편집하지 않고 의 동작을 동적으로 변경하는 것이 좋습니다 .
실제 예제를 제공하기 위해 기본적으로 Ubuntu 기본 상자를 사용하지만 환경 변수가 대체 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
이 예제는 https://github.com/puppetlabs/puppetlabs-openstack_dev_env 에서 가져 왔습니다.
이것은 VagrantfileRuby 일 뿐이므로 YAML은 또 다른 옵션입니다.
예를 들어, VagrantfileI do this :
# -*- 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
그런 다음 vagrant.yml개발자 별 구성 을위한 파일이 있습니다 (방금 이름을 만들었습니다. 원하는 이름을 사용할 수 있음).
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
모든 방랑 상자에 적용되는 설정을 정의 할 준비가 되었으면 "Vagrant는 실제로 일련의 방랑 파일을로드하여 진행되는대로 설정을 병합합니다."라는 점에 유의할 필요가 있습니다. (참조 https://docs.vagrantup.com/v2/vagrantfile/ )
따라서 ~/.vagrant.d/VagrantfileVagrant 상자의 RAM 양을 늘리기 위해 다음을 정의했습니다 .
Vagrant.configure(2) do |config|
config.vm.provider "virtualbox" do |vb|
vb.memory = 2048
end
end
여기에 아이디어가 있습니다. "추악"하고 "잘못"일 수 있지만 적어도 작동합니다. :)
# 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'
그것을 실행합시다
$ ruby file1.rb
first
included external file which uses outer var: bar
second
예제에 맞게 file2.rb는 config정의하지 않고의 사용법 만 포함 합니다 ( config외부 컨텍스트에서 제공됨).
config.vm.provision :puppet do |puppet|
puppet.facter = { "proxy" => "proxy.host:80" }
end
그리고 Vagrant 파일은 다음과 같습니다.
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
업데이트 (또 다른 "데이터 기반"접근 방식)
# 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
이것이 Nugrant 플러그인 이 해결하기 위해 만들어진 정확한 사용 사례라고 생각합니다 . 이를 통해 각 개발자 .vagrantuser는 YAML에서 사용자 지정 구성 값을 지정하는 (.gitignore-ed 파일) 을 가질 수 있으며 Vagrantfile.
귀하의 경우 프록시 된 개발자는 .vagrantuser다음과 같은 파일을 가질 것입니다 .
proxy: 'proxy.host:80'
그리고 당신 Vagrantfile은 다음과 같이 보일 것입니다 (의사 코드, 실제로 루비를 모릅니다).
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
vagrantuser.example개발자가 환경에 맞게 복사하고 조정할 수 있도록 샘플 / 참조 vagrantuser (예 :) 파일을 번들로 제공해야 합니다.
@Willie Wheeler의 답변을 확장하려면. 내 설정은 다음과 같습니다.
Root
|-- defaults.yml
|-- env.yml
|-- Vagrantfile
Vagrantfile
# Load local env config
require 'yaml'
dir = File.dirname(File.expand_path(__FILE__))
# defaults
settings = YAML::load_file("#{dir}/defaults.yml")
if File.exist?("#{dir}/env.yml")
env_settings = YAML::load_file("#{dir}/env.yml")
settings.merge!(env_settings)
end
...
# Customize the amount of memory on the VM:
vb.memory = settings["vb"]["memory"]
defaults.yml
vb:
memory: 1024
env.yml
vb:
memory: 204
이것은 당신이 가지고있는 모든 기본값을 당신의 개발 별 설정과 병합 할 것입니다. 또한 개발자가 실제로 변경할 수있는 값이 무엇인지 명확합니다.
vagrant-proxyconf 플러그인 사용을 고려하십시오 . 전 세계적으로 모든 Vagrant VM에 대한 프록시를 설정할 수 있습니다.
또 다른 해결책은 프로비저닝 중에 외부 셸 스크립트를 실행하는 것입니다. 처음에는 별도의 config.vm.provision섹션을 사용 Vagrantfile합니다.
# reset: true below is needed to reset the connection to the VM so that new
# environment variables set in /etc/environment will be picked up in next
# provisioning steps
config.vm.provision "shell", reset: true, inline: <<-SHELL
if [ -f /vagrant/Vagrantfile-settings.sh ]
then
/vagrant/Vagrantfile-settings.sh
fi
SHELL
Then just put a Vagrantfile-settings.sh file next to Vagrantfile, add it to .gitignore (or whatever) and put any script inside, for example to set proxy for interactive terminal, all daemons and docker containers:
# Proxy for interactive terminals
echo "http_proxy=http://PROXY_ADDRESS:PROXY_PORT" >> /etc/environment
echo "https_proxy=http://PROXY_ADDRESS:PROXY_PORT" >> /etc/environment
echo "no_proxy=127.0.0.1,localhost" >> /etc/environment
# Proxy for daemons (e.g. Docker deamon - used to pull images, apt - run from default daily cron job)
mkdir /etc/systemd/system.conf.d
echo [Manager] > /etc/systemd/system.conf.d/01-http-proxy.conf
echo "DefaultEnvironment=\"http_proxy=PROXY_ADDRESS:PROXY_PORT\"" >> /etc/systemd/system.conf.d/01-http-proxy.conf
echo "DefaultEnvironment=\"https_proxy=PROXY_ADDRESS:PROXY_PORT\"" >> /etc/systemd/system.conf.d/01-http-proxy.conf
echo "DefaultEnvironment=\"no_proxy=127.0.0.1,localhost\"" >> /etc/systemd/system.conf.d/01-http-proxy.conf
echo "# Docker requires upper-case http proxy environment variables..." >> /etc/systemd/system.conf.d/01-http-proxy.conf
echo "DefaultEnvironment=\"HTTP_PROXY=http://PROXY_ADDRESS:PROXY_PORT2\"" >> /etc/systemd/system.conf.d/01-http-proxy.conf
echo "DefaultEnvironment=\"HTTPS_PROXY=http://PROXY_ADDRESS:PROXY_PORT\"" >> /etc/systemd/system.conf.d/01-http-proxy.conf
echo "DefaultEnvironment=\"NO_PROXY=127.0.0.1,localhost\"" >> /etc/systemd/system.conf.d/01-http-proxy.conf
# Proxy for docker containers started with `docker run`
mkdir /home/vagrant/.docker
cat <<EOF > /home/vagrant/.docker/config.json
{
"proxies": {
"default": {
"httpProxy": "http:/PROXY_ADDRESS:PROXY_PORT",
"httpsProxy": "http://PROXY_ADDRESS:PROXY_PORT",
"noProxy": "127.0.0.1,localhost"
}
}
}
EOF
chown -R vagrant:vagrant /home/vagrant/.docker
You can load the settings from YAML file. This is demonstrated in Drupal VM as below:
# Use config.yml for basic VM configuration.
require 'yaml'
dir = File.dirname(File.expand_path(__FILE__))
if !File.exist?("#{dir}/config.yml")
raise 'Configuration file not found! Please copy example.config.yml to config.yml and try again.'
end
vconfig = YAML::load_file("#{dir}/config.yml")
So then you can create config.yml like:
vagrant_box: geerlingguy/ubuntu1404
vagrant_user: vagrant
vagrant_ip: 192.168.88.88
and in Vagrantfile you can use variables as:
config.vm.box = vconfig['vagrant_box']
config.vm.network "private_network", ip: vconfig['vagrant_ip']
ReferenceURL : https://stackoverflow.com/questions/13065576/override-vagrant-configuration-settings-locally-per-dev
'Nice programing' 카테고리의 다른 글
| PostgreSQL의 범위에서 날짜 목록 가져 오기 (0) | 2021.01.05 |
|---|---|
| 스크립트의 인수를 사용하여 두 번째 스크립트를 호출합니다. (0) | 2021.01.05 |
| 키 스토어 란? (0) | 2021.01.05 |
| Visual Studio Code에서 설정을 재설정하는 방법은 무엇입니까? (0) | 2021.01.05 |
| 텍스트 파일에 사전 쓰기? (0) | 2021.01.05 |