Ruby 在Chef中读取文件而不写入节点

Ruby 在Chef中读取文件而不写入节点,ruby,json,chef-infra,cookbook,Ruby,Json,Chef Infra,Cookbook,我试图读取一个文件的内容并在ruby代码中使用它。在这一步中,我不尝试在引导节点上执行任何操作。我所要做的就是读取一个JSON文件,该文件将驻留在cookbook的files文件夹中,然后读取该文件的内容并执行一些操作。我只想在代码本身中使用来自JSON的值。代码示例如下所示。感谢您的帮助 属性:default.rb default["xyz"]["ohs_servers"]=[ {"hostname"=> "intf301.linux.xyz.com","name" => "I

我试图读取一个文件的内容并在ruby代码中使用它。在这一步中,我不尝试在引导节点上执行任何操作。我所要做的就是读取一个JSON文件,该文件将驻留在cookbook的files文件夹中,然后读取该文件的内容并执行一些操作。我只想在代码本身中使用来自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"}
]
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"]
机器:机器.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"}
]
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
}

即使我真的不明白为什么您不想使用属性:

您想要的是确保cookbook文件在缓存中,即使没有资源调用它们,方法是在节点上配置
client.rb
,并将
no\u lazy\u load
属性设置为
true

引用有关此选项的信息:

无延迟加载
用于在 chef客户端运行的开始。默认值:
true

我不确定默认值是否已更改为12或wich版本,但我很确定chef 11中的值为false(调用引用它们的提供程序时加载文件或模板)

然后,您可以使用

File::read("#{Chef::Config['file_cache_path']}/cookbooks/my_cookbook/files/my_file.json")

编辑:刚刚看到Stephen King的评论,我在这里或多或少地转述了Seth Vargo的回答://

使用
cookbook\u文件
,然后添加
run\u操作(:create)

然后您可以从中读取一些ruby代码 比如说

File::read("somepathyouwantthefilebe/myfile.txt")

**运行操作是nessecary,因为您要在chef zero中组合ruby代码和资源

为什么要这样做?node对象已经是json了,为什么不把这些数据放到一个属性文件中呢?我想说的是,它应该为您提供磁盘上
environment.json
的路径。但我也不确定你的目标是什么。当我们知道这一点的时候,我们也许能够更好地帮助你。我正在尝试在不同的环境中重用这本食谱。我有不同环境的不同模板(json)文件。我不想从json文件中填充属性值。我上面的代码只是一个简单的说明,让它更容易理解。在这种情况下,您有一个环境烹饪书(空配方和一个包含您的值的属性文件),并在您的配方中使用它。我现在使用的是Chef zero。知道如何使用Chef zero访问文件吗?用cookbook_path替换文件_cache_path(如果您只有一个dir而没有数组,则可以使用)。注意:不仅在Chef zero中,这是在任何Chef运行(客户机、solo或zero)的编译时聚合资源的方法。