使用 json 作为 vagrantfile 对象的 properties\values

Use json as properties\values for vagrantfile object

流浪文件:

require 'json'

file = File.read('blueprint.json')
azure_data = JSON.parse(file)

Vagrant.configure('2') do |config|
  config.vm.define "master" do |node|
    node.vm.provider :azure do |azure, override|
      azure_data.each do |hash|
        hash.each do |key, value|
          azure[key] = value
        end
      end
      azure.vm_name = "somename"
    end
  end
end

vagrant up 给出了这个错误:

Microsoft Azure Provider:
* The following settings shouldn't exist: []

此外,如果我将 puts('something') 添加到 hash.each 循环中,它不会为 JSON 文件的每个 属性 输出一次,而是输出 6 次 (¿? ) 每个 属性

blueprint.json:

{
    "admin_username":"someuser",
    "location":"northeurope",
    "resource_group_name":"resourcegroup",
    "tcp_endpoints":"5000",
    "virtual_network_name":"vnetname",
    "vm_size":"Standard_DS1"
}

您的 JSon 文件已经是一个 JSon 对象,因此当您阅读它时,您直接拥有键值对。您可以执行以下操作来检查

require 'json'

file = File.read('blueprint.json')
azure_data = JSON.parse(file)

azure_data.each do |key, value|
  p key
  p value
end

所以在阅读你的 JSon 时你可以跳过 hash 部分,ruby 已经知道这是一个散列。 那么要动态设置对象属性,需要使用send方法

require 'json'

file = File.read('blueprint.json')
azure_data = JSON.parse(file)

Vagrant.configure('2') do |config|
  config.vm.define "master" do |node|
    node.vm.provider :azure do |azure, override|
      azure_data.each do |key, value|
        azure.send("#{key}=", value)
      end
      azure.vm_name = "somename"
    end
  end
end

看来这毕竟是可能的,感谢 this

config.vm.define "master" do |node_dotnet|
  node_dotnet.vm.provider :azure do |azure, override|
    azure_data.each do |key, value|
      azure.instance_variable_set("@#{key}", value)
    end 
    azure.vm_name = "master"
  end
end

伙计,Ruby 语法很糟糕

ps。出于某种原因,并非所有这些方法都有效。