2015-11-15 100 views
0

我正在使用下載,安裝,配置SDK的廚師社區食譜。 (我們稱之爲blah-sdk)。你只需要include_recipe'blah-sdk'和viola,它已經安裝了。它有一個屬性指定它將安裝的blah-sdk的版本。這個版本屬性反過來被用來形成相應的'download_url'屬性的值。理論上,我應該能夠將版本屬性的值設置爲食譜中的其他內容,其中包括blah-sdk。但有一個問題。在我的覆蓋版本屬性之前,download_url屬性被設置(使用在blah-sdk食譜中指定的默認版本)。所以錯誤的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 /屬性/默認值。 RB:

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

代碼演示問題和coderanger的建議的解決方案(如果你可以修復第三方食譜): 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 cookbook中定義的版本屬性來解析,而不是在我的包裝器中定義的版本屬性。 (順便說一下,我編輯了這個問題來反映你的建議,希望能讓它更清楚一點。) –

回答

4

有關此問題的概述,請參閱https://coderanger.net/derived-attributes/。沒有一個好的解決方案不涉及修改上游的食譜。最簡單的解決方案是複製包裝器中的派生屬性。

+0

這就是我害怕的答案。不過,我可以停止將我的頭撞在牆上,謝謝。真棒鏈接BTW。我會在寫我自己的食譜時使用它。 –