Nice programing

Vagrant 구성 설정을 로컬로 재정의 (개발자 별)

nicepro 2021. 1. 5. 21:10
반응형

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

반응형