2015-11-15 2 views
0

Я использую поваренную книгу сообщества шеф-повара, которая загружает, устанавливает, настраивает SDK. (Назовем это blah-sdk.) Вы просто include_recipe 'blah-sdk' и альта, он установлен. У него есть атрибут, определяющий версию blah-sdk, которую он установит. Этот атрибут версии, в свою очередь, используется для формирования значения соответствующего атрибута «download_url». В теории я должен был бы установить значение атрибута версии для чего-то еще в поваренной книге, где я включаю blah-sdk. Но есть проблема. Атрибут download_url устанавливается (используется версия по умолчанию, указанная в cookbook blah-sdk), прежде чем мой атрибут override version. Поэтому неправильный URL-адрес используется для получения версии по умолчанию, а не той версии, которую я хочу. Я мог бы установить download_url в своей поваренной книге, но это нарушает инкапсуляцию кулинарной книги «blah-sdk». Я также могу в конечном итоге сыграть в битку экспериментально с некоторым длинным потоком атрибутов, прежде чем заставить его работать. Должен быть лучший способ. Что это?Разрешение атрибута у шеф-повара

поваренные/бла-SDK/атрибутов/default.rb:

default['blah']['version'] = '24.4' 
default['blah']['download_url'] = "http://dl.company.com/blah/blah-sdk_r#{node['blah']['version']}-linux.tgz" 

поваренные/бла-SDK/Рецепты/default.rb:

... 
print("blah version: #{node['blah']['version']}") 
print("blah download_url: #{node['blah']['download_url']}") 
... 

поваренные книги/my_cookbook/атрибуты/по умолчанию. гь:

normal['blah']['version'] = '24.4.1' 

(.. Я также попытался использовать по умолчанию, force_default, переопределение и force_override Сделано никакой разницы)

поваренные книги/my_cookbook/рецепты/default.rb

... 
include_recipe 'blah-sdk' 
... 

Выход:

==> по умолчанию: версия мля: 24.4.1

==> по умолчанию: бла DOWNLOAD_URL : http://dl.company.com/blah/blah-sdk_r24.4-linux.tgz

Код, демонстрирующий проблему, и код (если вы можете исправить третью поваренную книгу): https://github.com/marc-swingler/stackoverflow_question

Не лучшее решение, но из-за заказа, в котором загружаются атрибуты, также отбрасывается версия в роль или среду. https://christinemdraper.wordpress.com/2014/10/06/avoiding-the-possible-pitfalls-of-derived-attributes/

+0

Использовать атрибуты обычного приоритета - это кулинарная книга-обертка и переопределять значения по умолчанию для поваренных книг. См. Пример: http://stackoverflow.com/questions/28775225/how-to-use-chef-to-update-alternatives-for-java-using-execute/28775684#28775684 –

+0

Пробовал это. Я также попробовал force_default, override и force_override. Тот же результат. Атрибут download_url разрешается с использованием атрибута версии, определенного в кулинарной книге blah-sdk, а не той, которая определена в моей обертке. (BTW, я отредактировал вопрос, чтобы отразить ваше предложение. Надеюсь, это станет немного понятнее.) –

ответ

4

См. https://coderanger.net/derived-attributes/ для обзора проблемы. Нет хорошего решения, которое не включает в себя модификацию поваренной книги по добыче. Самое простое решение - дублировать производный атрибут в вашей обертке.

+0

Вот что я боялся. Спасибо, но я могу остановить удар головой о стену. Удивительная ссылка BTW. Я буду использовать это при написании своих кулинарных книг. –