30

谁能指导我如何在我的 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 的新手,所以我也不确定是否只是语法错误?

编辑:我正在使用的更新代码

4

4 回答 4

60

我使用https://puphpet.com的方法,在 Vagrantfile 的同一目录中创建一个文件 config.yaml 并...

在我的流浪文件中:

# 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>...
于 2014-10-16T00:41:10.403 回答
6

使用require_relative

require_relative 'vagrant.rb'
include MyVars
# ...
于 2014-04-28T19:26:48.027 回答
4

尝试将您的要求更改为:

require './vagrant'
于 2013-05-23T09:30:12.233 回答
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 在上面的回答!

于 2014-05-22T03:31:19.147 回答