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

标签 ruby json chef-infra cookbook

我正在尝试读取文件的内容并在我的 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_load 属性设置为 true

引用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/

相关文章:

vagrant - 如何在 kitchen.yml 中进行多重配置?

ruby-on-rails - 在 ruby​​ 的纯 HTML 上按位置查找值

ruby-on-rails - 从 Ruby on Rails 应用程序中的串口读取挂起

javascript - 无法从 Ajax 请求中读取 Javascript 对象

ruby - 在 Ruby + Chef 中检查现有目录失败

ubuntu - 厨房没有检测到 Vagrant 插件 `kitchen-vagrant`

ruby - 如何优化 ActiveRecord find_in_batches 查询?

javascript - 是否可以模拟 Facebook 跟踪像素请求服务器端?

jquery - 从对 Last.FM API 的请求返回的文件中出现错误

javascript - 从 Postgres 以 ROR 的 JSON 格式获取数据到 Highcharts javascript