我有节点的配方和属性文件。例如。 localhost和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-hostname还没有设置......
我得到的顺序是: 1)加载属性/ default.rb 2)加载属性/ common.rb 3)关于+
的错误如何在common.rb之前加载localhost.rb?
答案 0 :(得分:12)
默认情况下,属性文件按字母顺序加载。这在过去并不完全一致,但已在CHEF-2903中修复。
因此,attributes/common.rb
之前加载attributes/localhost.rb
只是因为它按字母顺序排在前面。规则的一个例外是attributes/default.rb
,它总是在食谱中的任何其他属性文件之前加载。
通常,属性文件的加载顺序如下:
attributes/default.rb
(是否存在)您可以使用include_attribute
加载比通常加载的属性文件更早的属性文件,但是不能在以后加载它。
这个逻辑在厨师中是硬编码的,无法更改。您可以执行一些解决方法:
您可以强制再次加载属性文件:
node.from_file(run_context.resolve_attribute("cookcook_name", "attribute_file"))
答案 1 :(得分:1)
为什么不使用override_attribute
?这就是他们存在的原因:-)见Attribute Precedence。