Чтение файлов в 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 ответа:
Используйте
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: только что видел комментарий Стивена Кинга, я более или менее перефразировал ответ сета Варго здесь : /