Одним из атрибутов узла шеф-повара является массив хешей:
"array_of_hashes": [
{
"hash_key_1": "value1",
"hash_key2": "value2",
},
{
"hash_key_2": "value4",
"hash_key_1": "value3",
}
]
Мне нужно перебрать каждый элемент массива и создать файл конфигурации с параметрами шаблона, определенными значениями в хэшах:
# cat my_config.conf
key1=value1; key2=value2
key1=value3; key2=value4
Я не могу добиться этого результата, используя шаблон ресурс, потому что он перезаписывает файл конфигурации (не добавляет его) на каждой итерации цикла, и в результате я получаю только последнюю строку.
Как лучше всего создать такой конфигурационный файл, упомянутый выше?
Можете ли вы использовать блок bash?
http://wiki.opscode.com/display/chef/Resources#Resources-Script
Итак, что-то вроде:
bash "append_to_config" do
user "root"
cwd "/path/to/config/directory"
code <<-EOH
echo "#{node[:array_of_hashes][:hash_key]}=#{node[:array_of_hashes][:hash_value]}" > my_config.conf
EOH
end
Плюс любые петли, условия и т. Д., Которые вам понадобятся для работы.
Это не является строго встроенной в Chef функцией библиотеки или любого из ресурсов, потому что при управлении состоянием системы лучше и надежнее управлять всем содержимым файла. Если содержимое шаблона изменено где-то еще в другой кулинарной книге, подумайте, почему это так, и может ли быть целесообразным объединить рецепты.
Вы также можете использовать отличную функцию для «повторного открытия» определенного ресурса - resources
может использоваться для выбора конкретного ресурса. Очень простой пример:
Тем не менее, Chef::Util::FileEdit
У класса есть несколько вспомогательных методов для управления контентом. Билет, который изначально реализовал эту функцию, - ПОВАР-78. Это не задокументировано (извините) по причинам, о которых я упоминал выше. Существует патч для дальнейшего расширения этой библиотеки, чтобы добавить строку, если она не существует, которая находится в тикете ШЕФ-2740. Вы можете достичь желаемых результатов с помощью существующих методов библиотеки.