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

mbd*_*dev 7 chef-infra

我有节点的配方和属性文件.例如localhost和linode.我试图在默认或其他属性之前首先加载属性文件(并设置主机名等).例:

属性/ localhost.rb:

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

include_attribute 'mbdev::common'
Run Code Online (Sandbox Code Playgroud)

属性/ common.rb

default[:nginx][:website1][:url] = "subdomain." + default[:nginx][:hostname]
Run Code Online (Sandbox Code Playgroud)

食谱/ localhost.rb

include_recipe 'mbdev::default'
Run Code Online (Sandbox Code Playgroud)

运行列表:

'mbdev::localhost'
Run Code Online (Sandbox Code Playgroud)

但是,似乎include_attribute使'common'属性首先加载.因此nginx-hostname尚未设置...

我得到的顺序是:1)加载属性/ default.rb 2)加载属性/ common.rb 3)关于+的错误

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

Hol*_*ust 12

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

因此,attributes/common.rb之前attributes/localhost.rb只是因为它按字母顺序提前加载.规则的例外是attributes/default.rb是始终在cookbook中的任何其他属性文件之前加载.

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

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

您可以通过使用加载属性文件,而不是通常使用加载属性文件include_attribute,但是您不能以此方式加载它.

这个逻辑在厨师中是硬编码的,不能改变.您可以执行一些解决方法:

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

    node.from_file(run_context.resolve_attribute("cookcook_name", "attribute_file"))
    
    Run Code Online (Sandbox Code Playgroud)