在不写入节点的情况下读取Chef中的文件

时间:2015-04-13 22:02:29

标签: ruby json chef cookbook

我正在尝试阅读文件的内容并在我的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
}

2 个答案:

答案 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