2013-10-28 49 views
6

我有節點的配方和屬性文件。例如。本地主機和linode。我試圖讓屬性文件先加載(並設置主機名等)在默認或其他屬性之前。例如:如何獲取當前配方屬性文件首先被加載?

屬性/ localhost.rb:

default[:hostname] = "localhost" 
default[:nginx][:hostname] = 'mbdev-localhost' 

include_attribute 'mbdev::common' 

屬性/ common.rb

default[:nginx][:website1][:url] = "subdomain." + default[:nginx][:hostname] 

食譜/ localhost.rb

include_recipe 'mbdev::default' 

運行列表:

'mbdev::localhost' 

但是看起來include_attribute使'common'屬性首先加載。所以nginx的主機名尚未設置...

我得到的順序是: 1)加載屬性/ default.rb 2)加載屬性有關+

/common.rb 3)錯誤

如何在common.rb之前加載localhost.rb?

回答

10

默認情況下,屬性文件按字母順序裝入。這在過去並不完全一致,但在CHEF-2903中修復。

因此,您的attributes/common.rbattributes/localhost.rb之前加載,只是因爲它按字母順序排列。該規則的一個例外是attributes/default.rb,它總是在食譜中的任何其他屬性文件之前加載。

通常,屬性文件加載順序如下:

  1. 負載所有食譜依賴性按字母順序
  2. 本地attributes/default.rb的屬性(當它存在)
  3. 負載的任何其他屬性的文件按文件名字母順序排列

您可以加載一個屬性文件,它的加載時間通常比使用include_attribute,但是你不能以這種方式加載。

此邏輯在主廚中硬編碼,無法更改。您可以執行一些變通,但:

  • 你可以寫你的屬性文件的方式,加載順序並不重要了
  • 你能叫上名字的食譜/在某種程度上屬性與上面的邏輯
  • 一致
  • 可以強制執行的屬性文件被再次加載:

    node.from_file(run_context.resolve_attribute("cookcook_name", "attribute_file")) 
    
+0

你剛剛解決了我的大腦塊關於該死的配方如何知道屬性文件!!!!! +10,如果我可以...... TY – MegaMark

1

爲什麼不使用override_attribute?這就是它們存在的原因:-)請參閱Attribute Precedence

+0

這就要求我把所有主機相關的屬性重複自己的每一臺主機上。 – mbdev

+0

然後爲它定義一個角色 – StephenKing

相關問題