【问题标题】:Read files in Chef without writing to the node在 Chef 中读取文件而不写入节点
【发布时间】:2016-01-28 03:17:03
【问题描述】:

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

【问题讨论】:

  • 您为什么要这样做?节点对象已经是json了,为什么不直接把这些数据放到一个属性文件中呢?
  • 我想说this answer 应该为您提供磁盘上environment.json 的路径。但我也不确定你的目标是什么。当我们知道这一点时,我们也许能够更好地帮助您。
  • 我正在尝试为不同的环境重复使用说明书。对于不同的环境,我有不同的模板(json)文件。我不想从 json 文件中填充属性值。我上面的代码只是一个简单的说明,以便于理解。
  • 在这种情况下,您将获得一本环境说明书(空配方和一个包含您的值的属性文件)并在您的配方中使用它。

标签: ruby json chef-infra cookbook


【解决方案1】:

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

即使没有资源调用它们,您想要确保食谱文件在缓存中,方法是在具有no_lazy_load 属性的节点上将client.rb 配置为true

引用documentation 关于这个选项:

no_lazy_load 用于下载所有食谱文件和模板 厨师客户端运行的开始。默认值:true

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

然后您可以使用

读取您的文件
File::read("#{Chef::Config['file_cache_path']}/cookbooks/my_cookbook/files/my_file.json")

编辑:刚刚看到斯蒂芬金的评论,我在这里或多或少地转述了塞斯瓦戈的回答:/

【讨论】:

  • 我现在正在使用 Chef-zero。知道如何使用 Chef-zero 访问文件吗?
  • 将 file_cache_path 替换为 cookbook_path(如果你只有一个目录而不是数组,则可以使用)
【解决方案2】:

使用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")

** run 操作是必要的,因为您在 chef-zero 中组合了 ruby​​ 代码和资源

【讨论】:

  • 关于注释:不仅在 chef-zero 中,它是在任何 chef 运行(客户端、单独或零)中在编译时聚合资源的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
相关资源
最近更新 更多