Как использовать переменную локальной среды с Vagrant?

Я передаю свои локальные переменные среды следующим образом:

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |de|

  de.vm.box = 'ubuntu/trusty64'
  de.vm.hostname = 'virtual_machine'
  de.vm.network 'public_network', bridge:ENV['NETWORK_INTERFACE'], ip:'192.168.2.170'

  de.vm.provider "virtualbox" do |v|
    v.memory = 4096
    v.cpus = 2
  end

  de.vm.synced_folder '.', '/vagrant', disabled:true
  de.vm.synced_folder '../../synced/shared/', '/shared/'
  de.vm.synced_folder '../../synced/devops/', '/devops/'

  install = ENV['DEVOPS_HOME'] + '/vagrant/lib/install'
  de.vm.provision 'shell', path: install + '/basic'
  de.vm.provision 'shell', path: install + '/java8', args: ['automatic']
  de.vm.provision 'shell', path: install + '/aws_cli', args: [ENV['S3_AWS_ACCESS_KEY_ID'],ENV['S3_AWS_SECRET_ACCESS_KEY']]

  setup = ENV['DEVOPS_HOME'] + '/vagrant/lib/setup'
  de.vm.provision 'shell', path: setup + '/hosts'

  sys = ENV['DEVOPS_HOME'] + '/vagrant/lib/system'
  de.vm.provision 'shell', path: sys + '/add_user', args: ['virtual-machine',ENV['VIRTUAL_MACHINE_PASSWORD']]

  steps = ENV['DEVOPS_HOME'] + '/vagrant/server/virtual_machine/steps'
  de.vm.provision 'shell', path: steps + '/install_rserve'

end

Очевидно, для этого мне нужно установить эту переменную в моем файле ~/.profile. Но мне интересно, есть ли другой способ сделать это. Там, где мне не нужно сообщать об этом через Vagrantfile, это выглядит некрасиво.


person Valter Silva    schedule 10.02.2016    source источник
comment
это один из способов работы - другое решение, если вы распространяете коробку, состоит в том, чтобы добавить эти переменные в файл yaml (например, сын будет работать как любой другой файл) и прочитать файл в ваш Vagrantfile, поэтому вам не нужно устанавливать переменные в ваш bash.   -  person Frederic Henri    schedule 10.02.2016
comment
У вас есть ссылка, объясняющая этот подход, Фредерик? Это кажется очень интересным. Кстати, я не буду раздавать свои коробки, по крайней мере, пока :)   -  person Valter Silva    schedule 10.02.2016
comment
показывая пример моей настройки в ответе для видимости. на самом деле у меня нет ссылки, так как я придумал сам и читал по-разному, но ничего особенного, на самом деле я пришел к этому из-за использования puppet и hiera, поэтому я делюсь одним и тем же файлом (не знаю, хорошо это или плохо, но я считаю удобным)   -  person Frederic Henri    schedule 10.02.2016


Ответы (1)


один из способов, которым мне удается иметь зависимость от настроек, - это использовать внешний файл (я использую yaml, но любой файл будет работать как json .... Vagrantfile - это скрипт ruby, поэтому, пока вы можете легко читать его с помощью ruby, все в порядке )

Пример моего Vagrantfile с использованием зависимости Yaml

:# -*- mode: ruby -*-
# vi: set ft=ruby :

require 'yaml'
settings = YAML.load_file 'settings/common.yaml'

Vagrant.configure("2") do |config|

  config.vm.box = settings['host_box'] || "pws/centos65"
  config.ssh.username = settings['ssh_user']

  config.vm.define "db" do |db|
    db.vm.hostname = settings['db_hostname']
    db.vm.network "private_network", ip: settings['host_db_address']
  end

...

end

файл settings/common.yaml будет определен как

--- 
host_db_address:  "192.168.90.51" 
host_app_address: "192.168.90.52"

db_hostname:      "local.db"

ssh_user:         "pws"

Как сказано в комментарии, основное преимущество, которое я обнаружил при использовании этой техники, заключается в том, что вы распространяете box. Моя команда git клонирует проект, должна заполнить настройки (для зависимости от пароля и т. д.) и готова к работе.

person Frederic Henri    schedule 10.02.2016
comment
Это отличное решение, Фредерик! Спасибо, что поделились! :) - person Valter Silva; 10.02.2016
comment
Красивый ответ - person bluelurker; 09.05.2021