Чтение файлов в Chef без записи в узел


Я пытаюсь прочитать содержимое файла и использовать его в своем коде ruby. На этом этапе я не пытаюсь ничего делать на загрузочном узле. Все, что я хочу сделать, это прочитать файл JSON, который будет находиться в папке cookbook files, прочитать содержимое файла и что-то сделать. Я просто хочу использовать значение, исходящее из JSON, в самом коде. Пример кода приведен ниже. Любая помощь ценится.

Атрибуты: по умолчанию.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"}
]

Машины: машины.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"]

Файл JSON в папке cookbook files: environment.json

{
  "template_name": "environment_template",
  "number": 0
}
2 2

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 является несекретным, так как вы объединяете код ruby и ресурсы в chef-zero

Даже если я действительно не понимаю, почему вы не хотите использовать атрибуты для этого:

Вы хотите убедиться, что файлы поваренной книги находятся в кэше, даже если нет ресурса, вызывающего их, путь состоит в том, чтобы настроить client.rb на узле с атрибутом no_lazy_load на true

Цитируя документацию по этому варианту:

no_lazy_load Используйте для загрузки всех файлов поваренной книги и шаблонов в начало пробега шеф-повар-клиент. Значение по умолчанию: true.

Я не уверен, изменилось ли значение по умолчанию с 12 или на версии wich, но я совершенно уверен, что оно было ложным в chef 11 (загрузка файла или шаблона, когда вызывается поставщик, ссылающийся на них)

Затем вы можете прочитать свой файл с помощью

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

Edit: только что видел комментарий Стивена Кинга, я более или менее перефразировал ответ сета Варго здесь : /