2014-02-20 3 views
4

У меня есть рецепт в шеф-поваре, который я хочу использовать несколько раз (в нескольких ролях), только с несколькими параметрами. Я хочу иметь возможность использовать несколько таких ролей на одном узле.Parameterize рецепт шеф-повара

Как я могу «параметризовать» рецепт? Я не могу использовать атрибуты, потому что они находятся на узле, поэтому одна роль переопределит атрибуты другого.

ответ

3

Рекомендуемый подход в этом случае заключается в использовании легкого поставщика ресурсов или подобного.

Я думаю, что когда runlist сходится, он дедуплирует любые рецепты, поэтому, если у вас было 6 ролей, включая один и тот же рецепт, и добавили каждую роль в список выполнения, он только на самом деле запустил этот рецепт один раз.

Seems like someone asked opscode this before

Краткое введение в LWRP можно найти here, Althought, которое более чем выполнение создания нового.

В этом случае, если у вас есть LWRP, вы можете создать один рецепт, который вызывает его несколько раз или отдельные рецепты для каждого вызова.

Возможно, вы захотите использовать иерархию данных модели узла, чтобы построить какой-то объект, который представляет экземпляры, которые вы хотите запустить, и зацикливать его таким образом.

+0

Я использовал определения, но также рассмотрю LWRP. Спасибо. – amorfis

+1

Не проблема, мы сделали это для установки некоторых наших внутренних продуктов. Был выполнен набор общих шагов, которые нам нужно было сделать для каждого из них, поэтому мы определили ресурс, определяющий параметры, которые мы хотели бы изменить, а затем определили действие: install и затем получили несколько рецептов, которые выполняют установите для нас. Мы сделали это, а не автоматическую установку многих объектов, чтобы обеспечить удобство чтения списков воспроизведения – PatrickWalker

0

Я нашел этот ответ очень полезным, помогая мне с аналогичным вариантом использования. Я хотел бы поделиться простым примером создания объекта для итерации над тем, что PatrickWalker ссылается («... создайте какой-то объект, который представляет экземпляры .. и loop ...»). Надеюсь, это может помочь кому-то.

  1. Создать атрибут со значением, которое является JSON-строкой, содержащей массив для каждой итерации, и каждый элемент массива, содержащего параметры для каждой итерации.

  2. Итерации по этому массиву в рецепте, выполняющем действие с использованием параметров из строки JSON (вы можете инкапсулировать повторно используемый код в определение или LWRP).

Простой пример

Создает один или несколько файлов с определенными именами и содержимым, определенным в формате JSON:

Атрибут:

default['config'] = '{"files":[{"name":"/tmp/file_1","content":"file contents 1"},{"name":"/tmp/file_2","content":"file contents 2"}]}' 

Рецепт:

config = JSON.parse("#{node['config']}") 
files = config['files'] 

files.each do |file| 
    file "#{file['name']}" do 
    content "#{file['content']}" 
    end 
end 

You Можно экстраполируйте этот простой пример в свой собственный вариант использования.

Смежные вопросы