我正在尝试阅读文件的内容并在我的ruby代码中使用它。在这一步中,我不想在引导节点上做任何事情。我想要做的就是读取一个JSON文件,该文件将驻留在cookbook的文件夹中,并读取文件的内容并执行某些操作。我只想在代码本身中使用来自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
}
答案 0 :(得分:2)
即使我真的不明白为什么你不想为此使用属性:
你想要的是确保即使没有资源调用它们,也要确保cookbook文件在缓存中,要做的就是在client.rb
属性的节点上配置no_lazy_load
{ {1}}
引用documentation关于此选项:
true
用于下载所有食谱文件和模板 厨师 - 客户运行的开始。默认值:no_lazy_load
。
我不确定默认值是否已更改为12或更高版本,但我确信它在Chef 11中是错误的(在调用引用它们的提供程序时加载文件或模板)
然后您可以使用
读取您的文件true
编辑:刚看到Stephen King的评论,我或多或少地在这里解释了Seth Vargo的回答:/
答案 1 :(得分:1)
使用cookbook_file
,然后添加run_action(:create)
cookbook_file "myfile.txt" do
path "somepathyouwantthefilebe/myfile.txt"
source "myfile.txt" #the name of the file in files folder of your cookbook"
end.run_action(:create) # read notes** bellow
然后你可以用一些ruby代码来读取它 例如
File::read("somepathyouwantthefilebe/myfile.txt")
**由于您在chef-zero
中组合了ruby代码和资源,因此运行操作是nessecary