[chef] Re: Re: Re: Re: Re: Understanding node attributes set from 'role' cookbooks


Chronological Thread 
  • From: Lewis Thompson < >
  • To: chef < >
  • Subject: [chef] Re: Re: Re: Re: Re: Understanding node attributes set from 'role' cookbooks
  • Date: Mon, 17 Mar 2014 18:33:05 +0000

On 14 March 2014 19:39, Noah Kantrowitz 
< >
 wrote:
>> Are there any other tricks that I can do to force my wrapping
>> cookbook's recipe to be evaluated before that of the cookbook with
>> attribute logic?
>
> Unfortunately no, the load order of these is fixed where _all_ attribute 
> files are run (in topo order) and then recipes specified by the run list 
> are run. My solution to this is unfortunately a tad complex and involves 
> moving derived data to methods on my resource objects.

Hi Noah,

Thanks again for clarifying.

The following post is just to help explain for anybody else seeing
this.  In my example but the attributes & the recipe override were in
a single cookbook; this was my attempt at creating a concise example.

In actual fact I was attempting to override some attributes in one
cookbook from another.  It's not possible to do so from within the
recipe, however Noah's answer here helped clarify that it is possible
from within the attributes of the role cookbook.

Hence I now have the following example:

    roleattributes/attributes/default.rb:
    default['roleattributes']['test'] = true
    if node['roleattributes']['test'] == true
     default['roleattributes']['testistrue'] = true
    else
     default['roleattributes']['testistrue'] = false
    end

    roleattributes2/attributes/default.rb:
    default['roleattributes']['test'] = false

    roleattributes2/recipes/default.rb:
    include_recipe 'roleattributes'
    require 'pp'
    pp node.debug_value(:roleattributes, :test)
    pp node.debug_value(:roleattributes, :testistrue)

And the result I receive is exactly what I wanted:

    # pp node.debug_value(:roleattributes, :test)
    ["default", false],
    ["normal", false],
    # pp node.debug_value(:roleattributes, :testistrue)
    ["default", false],

Admittedly this is not as clean as having it defined entirely within a
recipe, but I can still make this work.

The key here for me was that cookbook attributes files are all
evaluated in their entirety before recipes are evaluated, hence any
login in attributes files cannot be manipulated from recipes.

Many thanks for the help guys.

Lewis



Archive powered by MHonArc 2.6.16.

§