Назад | Перейти на главную страницу

Как сгенерировать файл конфигурации из атрибута узла (массива) с помощью Chef?

Одним из атрибутов узла шеф-повара является массив хешей:

"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. Вы можете достичь желаемых результатов с помощью существующих методов библиотеки.