2014-01-08 3 views
6

Я пытаюсь реализовать кулинарную книгу обертки, беря вдохновение от How to Write Reusable Chef Cookbooks, Gangnam Style. Я хочу установить tomcat 7 на свой узел без приложения менеджера. Я создал обертку поваренную книгу со следующим attributes/default.rb файла:Приоритет атрибута в поваренной книге повара

default["tomcat"]["base_version"] = 7 
default["tomcat"]["deploy_manager_apps"] = false 

Атрибуты по умолчанию, представленные в tomcat/attributes/default.rb являются:

default["tomcat"]["base_version"] = 6 
#other attributes 
default["tomcat"]["deploy_manager_apps"] = true 
default["tomcat"]["user"] = "tomcat#{node["tomcat"]["base_version"]} 

Я хочу, чтобы переопределить эти значения по всем признакам. Однако атрибуты, такие как ["tomcat"]["user"], не получают превышения. Вышеуказанное значение имеет значение tomcat6 в node["tomcat"]["user"].

Должен ли я переопределить все атрибуты, относящиеся к ["tomcat"]["base_version"]}"? Если бы мои attributes/default.rb были загружены до того, как default.rb кулинарной книги tomcat это сработало бы хорошо.

Я использую Berkshelf, Vagrant и Chef solo для разработки. В metadata.rb моей поваренной книги я упомянул depends "tomcat".

Моя обычная поваренная книга находится по адресу https://github.com/vaibhavguptaIITD/hcentive-ops/tree/master/hc-tomcat, а кулинарная книга tomcat находится по адресу https://github.com/opscode-cookbooks/tomcat.

ответ

9

Это связано с тем, как/когда код рубина оценивается во время работы шеф-повара. В типичном прогоне Chef сначала обрабатываются файлы атрибутов в порядке зависимости, заданном run_list, как указано здесь: Chef 11 In-Depth: Attributes Changes.

Шеф-повар обнаруживает зависимость от кулинарной книги tomcat и сначала загружает/оценивает ее атрибуты. Так default["tomcat"]["user"] = "tomcat#{node["tomcat"]["base_version"]} устанавливается в tomcat6, потому что в то время, значение node["tomcat"]["base_version"] равно 6.

Позже, повар оценивает вашу обертку поваренную книгу и правильно устанавливает атрибут 7 node["tomcat"]["base_version"], однако node["tomcat"]["user"] никогда не переоцениваются.

Поэтому вы должны установить значение для node["tomcat"]["user"] в своей куковой книге обертки, если вы хотите изменить его значение.

+0

Спасибо за ваш ответ. Просто быть любопытным, не такая процедура немного громоздка при написании поваренной книги обертки. Не следует ли сначала загружать атрибуты повара обертки, прежде чем упакованная кулинарная книга. – Vaibhav

+1

Обсуждается это поведение в https://tickets.opscode.com/browse/CHEF-4837 –

+0

Это сообщение в блоге определяет это хорошо http://www.getchef.com/blog/2013/12/03/doing -wrapper-cookbooks-right/hopefully, они фиксируют это в следующем клиенте. Эта проблема превращает файл атрибута 2 строки в файл с 50 строками + атрибут –

1

Я столкнулся с этой проблемой. Это имеет смысл для меня также установить базовую переменную и установить другие переменные из него нравится:

default["apache"]["apache_docroot"] = '/var/www' 

#other attributes: 
default['apache']['webapp1_docroot'] = "#{node['apache']['apache_docroot']/webapp1}" 

получить: /var/www/webapp1

Как было указано, что происходит, Chef найти ваши зависит поваренные книги и загружает их сначала атрибуты. Кажется, что-то не так. Почему бы не загрузить моего родителя?

override["apache"]["apache_docroot"] = '/net1/websites' 

Сначала, тогда зависит будет хорошо работать. Они ниже и не будут переопределены.

Я нашел способ обойти эту проблему. Это не здорово, но это работает. Вы в конечном итоге делаете:

  • нагрузки зависит TOMCAT * .RB
  • Загрузить родительскую обертку * .RB
  • Reload зависит конкретный кот.Р.Б.

Вы можете использовать эту команду node.from_file перезагрузить атрибуты из другого файла:

puts "*** RUNNING bundle-apache-java-tomcat-example default.rb" 

# Reload bundle-apache-java-jboss::default attributes to reset var's depending on apache_docroot value 
node.from_file(run_context.resolve_attribute("bundle-apache-java-tomcat", "default")) 

это загружается cookbook: bundle-apache-java-tomcat, attribs file: default.rb

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

Я создал две новые кулинарные книги, которые, я надеюсь, упрощают настройку нескольких веб-сайтов. Вы можете установить или не установить прокси-ссылку из apache в tomcat.

https://github.com/stant/bundle-apache-java-tomcat-example (как использовать основные один) https://github.com/stant/bundle-apache-java-tomcat (главный)