Я пытаюсь выяснить, как я могу построить путь к папке шаблонов (или файлов, поскольку он работает одинаково), тогда я мог бы прочитать его и использовать ресурс шаблона в цикле, чтобы каждый файл шаблона мог запускать уведомление об изменении .
Я не могу использовать remote_directory, потому что хочу уведомлять службы только в случае изменения шаблона.
Я также хотел бы избежать ручной спецификации шаблонов, поскольку внутри этих каталогов может быть много файлов. Плюс это позволит нам изменять только конфиги в папке шаблонов, не касаясь рецепта.
Основная проблема заключается в подкаталогах, таких как default, host, host-version, и шеф-повар логики определяет правильную папку шаблонов. Я подумал, может быть, в одном из классов Chef есть метод, который я мог бы вызвать из своей специальной кулинарной книги, чтобы добраться до отправной точки моей логики (цикла).
Думаю, должно получиться примерно так:
entry_point = CHEF::...getEntryPointDir
entry_point.glob..
.each do
template fname do
...
end
end
Буду признателен за любую помощь!
ПРЕДУПРЕЖДЕНИЕ: Это решение использует частный интерфейс, который может быть изменен или удален без предупреждения. Chef в настоящее время (13.x) не предоставляет поддерживаемого способа решения этой проблемы - рассмотрите альтернативный подход к решению вашей задачи.
Теперь, когда вас предупредили, вот как это сделать в рецепте:
# Get the Chef::CookbookVersion for the current cookbook
cb = run_context.cookbook_collection[cookbook_name]
# Loop over the array of files.
# 'templates' will also work.
cb.manifest['files'].each do |cookbookfile|
Chef::Log("found: " + cookbookfile['name'])
end
Я поделился пример рецепта чтобы показать это в контексте.
На практике это должно быть более сложным - например, вам может понадобиться только подмножество файлов / шаблонов в кулинарной книге или вам нужно каким-то образом преобразовать пути. Подумайте о написании библиотечной функции, которая составляет список интересующих вас файлов и вызывает ее из вашего рецепта.
Спасибо "zts". Я создал один для создания каталога шаблонов со всеми файлами .erb внутри.
cb = run_context.cookbook_collection[cookbook_name]
# you may get 'files' OR 'templates' from manifest
cb.manifest['templates'].each do |tmpl_manifest|
filepath = tmpl_manifest['path']
next if not filepath =~ /#{cmk_colo}\/server\/checks\/.*erb/
filename = tmpl_manifest['name'].split(".erb")[0]
fileshortpath=filepath.split("/",3)[2]
template "/opt/omd/sites/prod/etc/check_mk/conf.d/checks/#{filename}" do
source fileshortpath
mode '0644'
owner 'prod'
group 'prod'
end
end
этот получает полный / длинный путь ко всем файлам .erb в каталоге шаблонов. Если путь совпадает с именем каталога, который вы хотите зациклить, он создает его по стандартному рецепту шаблона.
Спасибо @zts и @Zaur. Я думал, что опубликую свой полный ответ, который в итоге объединил оба. Обратите внимание на то, что имя в вашей кулинарной книге должен быть в кавычках. Для меня это было неочевидно и в моем случае было чем-то вроде препятствия.
Во-вторых, вместо использования поиска @Zaur RegEx для фильтрации путей к файлам я использую более «рубиновый» способ сравнения строк, чтобы увидеть, содержит ли путь конкретный каталог:
# Get the Chef::CookbookVersion for this cookbook
cb = run_context.cookbook_collection['cookbook_name']
# Loop over the array of files
cb.manifest['files'].each do |cbf|
# cbf['path'] is relative to the cookbook root, eg
# 'files/default/foo.txt'
# cbf['name'] strips the first two directories, eg
# 'foo.txt'
filepath = cbf['path']
filename = cbf['name']
next if not filepath.include? "directory-to-filter-for/"
cookbook_file "/etc/service/conf.d/#{filename}" do
source "directory-to-filter-for/#{filename}"
mode 0600
owner "root"
group "root"
end
end
Я использую это для файлов, но вы также можете использовать шаблоны. Просто замените блок 'template' вместо блока 'file' в строке 14. Затем измените строку 5, чтобы использовать шаблоны вместо файлов:
cb.manifest['templates'].each do |cbf|
В Chef> 12.19 есть критическое изменение (RFC 67) в манифесте, которое объединяет все файлы в кулинарной книге под :all_files
Видеть https://chef.github.io/chef-rfc/rfc067-cookbook-segment-deprecation.html
Чтобы вернуть список всех шаблонов, вы теперь используете:
run_context.cookbook_collection[:examplecookbook].files_for('templates')