7

I am trying to implement a wrapper cookbook by taking inspiration from How to Write Reusable Chef Cookbooks, Gangnam Style. I wish to install tomcat 7 on my node without manager app. I have created a wrapper cookbook with the following attributes/default.rb file:

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

The default attributes provided in tomcat/attributes/default.rb are:

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

I wish to override these values across all attributes. However attributes such as ["tomcat"]["user"] are not getting overriden. The above still has the value of tomcat6 in node["tomcat"]["user"].

Do I have to override all the attributes which refer to ["tomcat"]["base_version"]}"? If my attributes/default.rb were loaded before tomcat cookbook's default.rb this would have worked fine.

I am using Berkshelf, Vagrant and Chef solo for development. In metadata.rb of my cookbook, I have mentioned depends "tomcat".

My custom cookbook is located at https://github.com/vaibhavguptaIITD/hcentive-ops/tree/master/hc-tomcat and tomcat community cookbook is located at https://github.com/opscode-cookbooks/tomcat.

4

3 に答える 3

9

これは、Chef の実行中に ruby​​ コードがいつどのように評価されるかによるものです。典型的な Chef の実行では、最初に属性ファイルが評価されます。これは、「 Chef 11 In-Depth: Attributes Changes」で説明されているように、run_list によって指定された依存関係の順序で行われます。

Chef はクックブックへの依存関係を検出し、tomcat最初にその属性をロード/評価します。Sodefault["tomcat"]["user"] = "tomcat#{node["tomcat"]["base_version"]}が設定されてtomcat6いるのは、その時点での値node["tomcat"]["base_version"]が 6 であるためです。

その後、Chef はラッパー クックブックを評価し、node["tomcat"]["base_version"]属性を適切に 7 に設定しますが、node["tomcat"]["user"]再評価されることはありません。

node["tomcat"]["user"]したがって、値を変更したい場合は、ラッパークックブックで値を設定する必要があります。

于 2014-01-08T16:44:35.593 に答える