【问题标题】:Vagrantfile and external config - what am I doing wrong?Vagrantfile 和外部配置 - 我做错了什么?
【发布时间】:2017-07-17 15:28:38
【问题描述】:

从未使用过 Ruby,但这看起来很简单,看过几个例子后 - 不工作 - 我错过了什么?

vmconfig.yml:

server:   
    hostname: mydomain.com

流浪文件

require 'yaml'
vmconfig = YAML.load_file('vmconfig.yml')

Vagrant.configure(2) do |config|
  config.vm.box = "debian/contrib-jessie64"

  config.vm.provision "shell", inline: <<-SHELL
    apt-get update

    hostname vmconfig["server"]["hostname"]
    config.vm.synced_folder ".", "/vagrant", type: "virtualbox"
end

当虚拟机完成构建时,主机名没有设置(应该设置什么配置文件)???如果我对值进行硬编码,它可以正常工作???

【问题讨论】:

    标签: ruby vagrant vagrantfile


    【解决方案1】:

    最好使用 vagrant 来定义虚拟机的主机名,如下所示

      config.vm.provision "shell", inline: <<-SHELL
        apt-get update
      SHELL
    
      config.vm.hostname = vmconfig["server"]["hostname"]
      config.vm.synced_folder ".", "/vagrant", type: "virtualbox"
    

    你可以看到other available settings,你可以在你的 Vagrantfile 中定义

    如果你想通过 yaml 运行并从脚本编写,你需要使用 string interpolation 来完成

      config.vm.provision "shell", inline: <<-SHELL
        apt-get update
        hostname #{vmconfig["server"]["hostname"]}
        .... set other things from yaml with #{<variable>} ....
      SHELL
    

    【讨论】:

    • 感谢您的更新回复,但我很好奇为什么我看到的示例似乎都没有使用插值字符串 (stackoverflow.com/a/26394449/897075) 这正是我想要做的。我不得不承认,字符串插值看起来很糟糕,但它似乎确实起到了作用——但现在我试图理解为什么?所有这些例子和我所拥有的有什么不同?
    • 我想我可能已经弄清楚为什么...我看到的例子是使用 config.vm.XXX - 我的错 :)
    • 不不一样——看我的第一个代码sn -p没有使用字符串插值,vagrant会直接通过读取yaml文件得到预期的主机名;在第二部分虽然我需要字符串插值,因为整个脚本是在文本中运行的(在这种情况下是 SHELL 字符串变量),所以你需要一种方法来告诉 vagrant 必须从 yaml 读取主机名部分并且它的变量不是只是一些随机文本
    • 对对对 - 明白了...非常感谢!!!祝你有美好的一天:)
    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2011-06-01
    • 1970-01-01
    • 2012-02-17
    • 2011-12-22
    • 1970-01-01
    相关资源
    最近更新 更多