有人可以指导我如何在VagrantFile中包含变量吗?我试图从外部文件中将配置注入到Vagrantfile中,这样我就可以将配置分发给我的同事,而无需直接在Vagrantfile上硬编码配置。
我曾经想过,因为它是基于Ruby的,我可以只包含一个Ruby文件,但是我收到了一个错误 消息:未初始化的常量MyVars
我的VagrantFile简化
# -*- mode: ruby -*-
# vi: set ft=ruby :
require 'vagrant.rb'
include MyVars
Vagrant.configure("2") do |config|
# Web
config.vm.define :joe do |joe|
joe.vm.box = "precise64_4.2.12"
joe.vm.hostname = WEBVMNAME
joe.vm.network :private_network, ip: "192.168.140.141"
# Port Forwarding
joe.vm.network :forwarded_port, guest: 22, host: 2201
joe.vm.network :forwarded_port, guest: 80, host: 8080
# Bootstrap Bash Script
joe.vm.provision :shell, :path => "bootstrap.sh"
end
end
并且vagrant.rb包含
module MyVars
WEBVMNAME = "rex"
end
请注意我也是Ruby的新手,所以我不确定它是否只是我的错误的语法?
编辑:我正在使用的更新代码
答案 0 :(得分:50)
我使用https://puphpet.com的方法,我在Vagrantfile的同一目录中创建了一个文件config.yaml,并且......
在我的Vagrantfile中:
# encoding: utf-8
# -*- mode: ruby -*-
# vi: set ft=ruby :
require 'yaml'
current_dir = File.dirname(File.expand_path(__FILE__))
configs = YAML.load_file("#{current_dir}/config.yaml")
vagrant_config = configs['configs'][configs['configs']['use']]
Vagrant.configure('2') do |config|
config.vm.network 'public_network', ip: vagrant_config['public_ip']
...
在我的config.yaml:
中---
configs:
use: 'home'
office:
public_ip: '192.168.2.117'
<more variables>...
home:
public_ip: '192.168.1.117'
<more variables>...
答案 1 :(得分:5)
使用require_relative
:
require_relative 'vagrant.rb'
include MyVars
# ...
答案 2 :(得分:4)
尝试将您的要求更改为:
require './vagrant'
答案 3 :(得分:1)
我创建了一个库目录:
require './lib/cfpEnvironment.rb'
include CFPEnvironment
然后编写了我需要动态的脚本,在创建的模块中定义变量......
CFPPorts.select{ |key, value| value.numeric? }.each { |key, value|
config.vm.network :forwarded_port, guest: value, host: value
}
感谢@Matt和@strager的上述答案!