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 에서 가져 왔습니다.
이것은 Vagrantfile
Ruby 일 뿐이므로 YAML은 또 다른 옵션입니다.
예를 들어, Vagrantfile
I 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/Vagrantfile
Vagrant 상자의 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 |