Согласно документам, решение Марка Рида, безусловно, должно работать. Но когда я попробовал это в Vagrantfile:
JSON.create_id = nil
vagrant_json = JSON.parse(Pathname(__FILE__).dirname.join('nodes', "#{node_name}.json").read)
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
chef.roles_path = "roles"
chef.data_bags_path = "data_bags"
chef.node_name = node_name
chef.run_list = vagrant_json.delete('run_list')
chef.json = vagrant_json
end
vagrant_json.class был Hash, но он все равно сохранял значение json_class внутри всякий раз, когда файл node.json содержал запись "json_class": "Chef :: Node" . Затем при использовании хэша для установки значения chef.json в последней строке оно снова интерпретировалось с использованием класса json (и, как ни странно, результатом стал пустой список выполнения).
Вот что сработало. Та же идея, но немного менее изящная:
vagrant_json = JSON.parse(Pathname(__FILE__).dirname.join('nodes', "#{node_name}.json").read)
vagrant_json['json_class'] = nil # <== This worked
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
chef.roles_path = "roles"
chef.data_bags_path = "data_bags"
chef.node_name = node_name
chef.run_list = vagrant_json.delete('run_list')
chef.json = vagrant_json
end
Этот код работал для установки как атрибутов json, так и списка выполнения из файла узла Chef, с или без "json_class": "Chef :: Node" запись.
Таким образом, предыдущий ответ кажется совершенно правильным в отношении получения хеша из JSON.parse, но если вы не удалите пару json_class из этого хеша, позже могут возникнуть проблемы, как в этом случае.