我正在尝试读取文件的内容并在我的 ruby 代码中使用它。在此步骤中,我不会尝试在引导节点上执行任何操作。我想做的就是读取一个 JSON 文件,该文件将驻留在说明书的文件文件夹中,并读取文件的内容并执行某些操作。我只想在我的代码本身中使用来自 JSON 的值。代码示例如下所示。如有任何帮助,我们将不胜感激。
属性:default.rb
default["xyz"]["ohs_servers"]=[
{"hostname"=> "intf301.linux.xyz.com","name" => "INTFIN_OHS_001", "short_name" => "OGS", "port" => "9931"},
{"hostname"=> "intf302.linux.xyz.com","name" => "INTFIN_OHS_001", "short_name" => "OHS", "port" => "9931"}
]
机器:machines.rb
require 'rubygems'
require 'json'
require 'pp'
json = File.read('environment.json')
obj = JSON.parse(json)
number = obj["name"]
x = node["xyz"]["ohs_servers"][number]["hostname"]
cookbook 文件夹中的 JSON 文件:environment.json
{
"template_name": "environment_template",
"number": 0
}
最佳答案
即使我真的不明白为什么你不想为此使用属性:
您想要的是确保 Recipe 文件位于缓存中,即使没有资源调用它们,方法是使用 在节点上配置
属性设置为 client.rb
no_lazy_loadtrue
引用documentation关于此选项:
no_lazy_load
Use to download all cookbook files and templates at the beginning of the chef-client run. Default value:true
.
我不确定默认值是否随 12 或 wich 版本而更改,但我很确定在 Chef 11 中它是错误的(调用引用它们的提供程序时加载文件或模板)
然后您可以使用
读取您的文件File::read("#{Chef::Config['file_cache_path']}/cookbooks/my_cookbook/files/my_file.json")
编辑:刚刚看到斯蒂芬·金的评论,我或多或少地解释了塞思·瓦戈的回答:/
关于ruby - 在 Chef 中读取文件而不写入节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29615840/