如何获取当前配方属性文件?

时间:2013-10-28 06:33:19

标签: chef

我有节点的配方和属性文件。例如。 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?

2 个答案:

答案 0 :(得分:12)

默认情况下,属性文件按字母顺序加载。这在过去并不完全一致,但已在CHEF-2903中修复。

因此,attributes/common.rb之前加载attributes/localhost.rb只是因为它按字母顺序排在前面。规则的一个例外是attributes/default.rb,它总是在食谱中的任何其他属性文件之前加载。

通常,属性文件的加载顺序如下:

  1. 按字母顺序加载所有cookbook依赖项的属性
  2. 加载attributes/default.rb(是否存在)
  3. 按文件名
  4. 按字母顺序加载任何其他属性文件

    您可以使用include_attribute加载比通常加载的属性文件更早的属性文件,但是不能在以后加载它。

    这个逻辑在厨师中是硬编码的,无法更改。您可以执行一些解决方法:

    • 您可以用加载顺序不再重要的方式编写属性文件
    • 您可以按照与上述逻辑
    • 一致的方式命名食谱/属性
    • 您可以强制再次加载属性文件:

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

答案 1 :(得分:1)

为什么不使用override_attribute?这就是他们存在的原因:-)见Attribute Precedence