2016-05-25 5 views
0

Есть ли способ получить доступ к сумке данных шеф-повара из файла атрибутов default.rb?Доступ к пакету данных шеф-повара из файла атрибутов

Мой пример использования. Мне нужно представить коллекцию переменных среды операционной системы как хэш атрибутов, которые в конечном итоге передаются шаблону. Некоторые из этих переменных среды - это учетные данные, которые я храню в зашифрованном пакете данных. К сожалению, шеф-повар не позволит мне получить доступ к рецепту DSL из файла атрибутов, поэтому метод data_bag_item, который я обычно использовал, недоступен.

Заранее спасибо.

+1

Хотя у вас может не быть рецепта DSL, я не думаю, что существует какой-либо запрет на вызов различных методов, например. [Chef :: DataBagItem.load] (http://www.rubydoc.info/github/opscode/chef/Chef/DataBagItem#load-class_method). Как утверждают другие плакаты, вероятно, лучше указать значения по умолчанию в вашем файле атрибутов и использовать рецепт для загрузки пакета данных. – Martin

ответ

2

Вы не можете использовать помощники DSL, но можете напрямую использовать Chef::DataBagItem.load. Проверьте код Chef, чтобы узнать, как его использовать (мы не документируем эти API AFAIK).

3

Почему вы не можете установить атрибут в рецепте из пакета данных и использовать его, как ожидалось. Обычно я устанавливал значение по умолчанию в attributes/default.rb для того же самого значения, только если мешок данных не существует во время выполнения.

В атрибутах файла:

default['cookbook_name']['secret_value'] = '__UNDEFINED__' 

Затем в рецепте вы заполняете и ссылаться на атрибут, как и ожидалось:

node.default['cookbook_name']['secret_value'] = data_bag_item('something', 'else') 

Атрибуты файлов используется в качестве места для хранения атрибутов. Как только рецепт будет скомпилирован, конечный результат будет запущен. Там, где значение пришло, не важно в этот момент.

+0

Хороший ответ, но это потому, что рецепт обобщен. Он объединяет список объектов для развертывания, только некоторые из которых требуют переменных среды учетных данных. Поэтому я надеялся сохранить специализацию в файле атрибутов. –

+0

Как насчет lambdas для каждого атрибута, а затем вызывать в рецепте. Это сохранит код, логически, в файле атрибутов, даже если он выполнялся в рецепте. Думая о строках 'default ['cookbook_name'] ['secret_value'] = lambda {data_bag_item ('something', 'else')}'. Файлы атрибутов по-прежнему являются Ruby, поэтому они должны функционировать, если в случае необходимости в рецепте используется «.call». –

+0

'node ['whatever'] = value' выдает ошибку в шеф-поваре 12.8 (по крайней мере), предпочитает' node.default ['whatever'] = value' – Tensibai