[chef] Re: Chef 11 Attribute Changes -- Computed Attributes Edition


Chronological Thread 
  • From: Marschall Marschall < >
  • To:
  • Subject: [chef] Re: Chef 11 Attribute Changes -- Computed Attributes Edition
  • Date: Tue, 6 Nov 2012 09:23:55 +0100

That's really great news! I got bit by this more than once...

Regards, Matthias

Am 06.11.2012 um 01:07 schrieb Daniel DeLeo 
< >:

> Ohai Chefs,
> 
> We recently merged some additional changes to attributes behavior for
> Chef 11 that I'd like to make you aware of.
> 
> ## TLDR
> 
> * Attributes from roles and environments are available when attribute
>   files are evaluated.
> * Chef::Node now includes platform introspection methods, so you can use
>   `plaform?()` and friends in attributes files.
> * Default and Override attributes from cookbooks, roles, and
>   environments are stored separately during the Chef run.
> * As a consequence of the above, setting a default or override attribute
>   in a recipe will no longer overwrite a value set by a role or
>   environment.
> * CHEF-2936 http://tickets.opscode.com/browse/CHEF-2936
> 
> ## Accessing Role and Environment Attributes in Attributes Files
> 
> In Chef 10.x and previous, you cannot set attribute values that depend
> on other attributes in attributes files, because you do not have access
> to attributes from roles. For example, suppose you want to configure the
> database for your app. You'd expect code like this to work (in an
> attributes file):
> 
>         node.default[:app][:name] = "my_app"
>         node.default[:app][:env] = "development"
> 
>         node.default[:app][:database] ="#{node.app.name}_#{node.app.env}"
> 
> However, this will not work if you intend to set `node[:app][:name]` or
> `node[:app][:env]` via roles or environments, because Chef will not have
> seen those attributes when evaluating the attributes files.
> 
> In Chef 11, role and environment attributes are applied when the
> run_list is expanded, so the above code will work the way you want it
> to.
> 
> ## Setting Platform-Specific Attributes in Attributes Files
> 
> In Chef 10.x and previous, the utility methods for making choices based
> on a node's platform or platform_family are available in recipes, but
> not in attributes files. Some users have expressed a desire to be able
> to set attributes based on platform in their attributes files. In Chef
> 11, these methods are now available on node objects, so you can use them
> in attributes files. E.g.,:
> 
>     if platform?(:debian, :ubuntu)
>       default[:foo] = "debian value"
>     elsif platform?(:centos, :rhel)
>       default[:foo] = "rhel value"
>     else
>       default[:foo] = "generic value"
>     end
> 
> ## Cookbook Style
> 
> Together, these changes mean you can move attributes computations out of
> recipes and into attributes files. I personally think this style will be
> much better than what you must do currently, but we (Opscode) haven't
> made any official recommendation on this question yet. Do keep in mind
> that any cookbook written using these features won't be usable on Chef
> 10.x systems if you intend to make your cookbook public.
> 
> If you wish to write your cookbooks with computed attributes in
> attributes files, don't forget to use `include_attribute()` to enforce
> the desired attribute file load order.
> 
> ## Breaking Changes
> 
> The implementation change that makes these features possible is a
> potentially breaking change.
> 
> During a Chef run, default and override attributes from cookbooks,
> roles, and environments are now stored separately. In the following
> cases, you may get a different result when computing the value of an
> attribute:
> 
> ### Attributes Files and Recipes Have the Same Precedence
> 
> In Chef 10.x and previous, setting a default attribute value in a recipe
> would overwrite a value set by a role or environment. In Chef 11, values
> set from a cookbook are stored separately, so the value set by the role
> or environment will not be overwritten.
> 
> Consider a role like this:
> 
>     default_attributes "app_name" => "from-role"
> 
> And a recipe file like this:
> 
>     node.default["app_name"] = "from-recipe"
> 
> In Chef 10.x and lower, the value of `node["app_name"]` will be
> "from-recipe". In Chef 11, the value will be "from-role"
> 
> ### Role and Environment Attributes are Visible to Attributes Files
> 
> If, for some reason, you have been depending on attributes from roles
> and environments not being visible during attribute file evaluation, you
> will need to adjust your cookbooks or roles for this change.
> 
> 
> ### What to Look For
> 
> Unlike the other changes to attributes in Chef 11, this one is a
> behavior change, meaning that valid usage can lead to different results
> in Chef 11 compared to Chef 10. I expect the vast majority of users will
> not be affected, since it's unlikely you were depending on the old
> behavior intentionally.
> 
> To see if you're affected, you'll need to take a look at your cookbooks
> and roles and look for attribute conflicts.
> 
> One strategy is to inspect your recipes to see if you're setting
> defaults:
> 
>     find . -name recipes -exec grep -n 'node.default' -r {} \;
> 
> ...and compare with your roles to see if there's a conflict.
> 
> Another option is to use why-run mode and inspect the output for any
> unexpected configuration changes.
> 
> 
> 
> -- 
> Daniel DeLeo
> 




Archive powered by MHonArc 2.6.16.

§