2014-01-08 169 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"]之類的屬性沒有被覆蓋。以上仍然在node["tomcat"]["user"]中的值爲tomcat6

是否必須覆蓋所有涉及["tomcat"]["base_version"]}"的屬性?如果我的attributes/default.rb在tomcat cookbook的default.rb之前加載,這將工作正常。

我使用Berkshelf,Vagrant和廚師獨奏進行開發。在我的食譜的metadata.rb中,我提到了depends "tomcat"

我的自定義食譜位於https://github.com/vaibhavguptaIITD/hcentive-ops/tree/master/hc-tomcat,tomcat社區食譜位於https://github.com/opscode-cookbooks/tomcat

回答

9

這是由於Chef運行期間如何/何時評估ruby代碼所致。在一個典型的Chef運行中,屬性文件首先被評估,按照這裏提到的run_list的依賴順序進行評估:Chef 11 In-Depth: Attributes Changes

廚師檢測到對食譜的依賴關係,並首先加載/評估其屬性。所以default["tomcat"]["user"] = "tomcat#{node["tomcat"]["base_version"]}是因爲當時設定tomcat6node["tomcat"]["base_version"]值是6。

後來,廚師評估您的包裝食譜和正確設置node["tomcat"]["base_version"]屬性爲7,但是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 /希望他們在下一個客戶端修復它。此問題將2行屬性文件轉換爲50行+屬性文件 –

1

我遇到了同樣的問題。這對我來說很有意義也設置一個基礎變量,並從中設置其他變量,如:

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

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

獲得:/var/www/webapp1

正如指出的那樣,會發生什麼情況是廚師找到自己要看的食譜,並加載它們屬性第一。在某種意義上似乎是錯誤的。爲什麼不加載我的父母

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

首先,那麼依賴將工作正常。它們較低並且不會被覆蓋。

我找到了解決這個問題的方法。這不是很好,但它的工作原理。 你最終做:

  • 負載取決於tomcat的* .RB
  • 載入父包裝* .RB
  • 刷新依賴特定於Tomcat。RB

您可以使用此命令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

側面說明:我結束了在我的食譜離開這一點,但我想使用散列來設置網站屬性「更簡單」的方式。當我同時初始化一個散列時,我無法設置另一個屬性,但是我將該代碼留在那裏以防萬一我仍然需要它。

我創建了2個新的捆綁食譜,我希望可以很容易地建立多個網站。您也可以設置或不設置從apache到tomcat的代理鏈接。

https://github.com/stant/bundle-apache-java-tomcat-example(如何使用主要的一個) https://github.com/stant/bundle-apache-java-tomcat(主要的)