OverviewAttributes are Node data such as the IP address, hostname, loaded kernel modules, version of programming languages available on the system and more. New attributes can be dynamically added to the node in a variety of ways. During the Chef run, the Chef Client saves these node attributes on the Chef Server where they are indexed for Search. When the Chef Client runs again, it will retrieve the attributes that were saved previously and merge in attributes based on the priority rules described below. Attribute Type and Precedence
There are three types of attributes in order of precedence, highest to lowest.
Write your cookbooks with default attributes, but override these with role-specific or node-specific values as necessary. A fourth attribute type, Attributes are a special key-value store called a Mash within the Ruby DSL context. A Mash is just a Hash where the key can be either a Ruby symbol (:key) or a string ("key"). The keys are also auto-vivified into accessor methods, which we'll talk about in a moment. |
|
Setting Attributes
Attributes may be set on the node from the following objects
The precedence of the attributes is as follows, from low to high:
See examples here... Cookbook AttributesCookbook attribute files are found in the e.g. from Opscode's Apache cookbook: cookbooks/apache2/attributes/default.rb The use of the node object is implicit here. The following is equivalent: cookbooks/apache2/attributes/default.rb Attributes can be set in a recipe as well, but Cookbook Attribute MethodsUse the following methods within a cookbook's attributes file or in a recipe. They correspond to the attribute type of the same name (set is an alias for normal).
Additionally, there are Another handy method available related to attributes is the attribute?() in attributes file attribute?() in recipe In the recipe, we need to use the method on the node object. In the attributes file, the node object is implicit. In either, we can also look for a sub-key of an attribute by chaining the attribute as methods: attribute?() in recipe Cookbook Attribute File OrderingWhen Chef loads cookbook attribute files, it does so in alphabetical order for all the cookbooks. If you need to ensure that one attribute file is loaded before another (for example, if your Rails cookbook requires that the Apache attributes are available first) you can use the include_attribute This loads The syntax for this follows the same "double colon" pattern as include_attribute This loads the Reloading Attribute Files From RecipesAttributes sometimes depend on actions taken from within recipes, so it may be necessary to reload a given attribute from within a recipe. For example: if you have an attribute that reads firewall rules, and a recipe that installs a firewall package, the firewall attributes will not be set the first time you execute the cookbook. Since reloading attributes from recipes Attribute Accessor MethodsAttribute accessor methods are automatically created and the method invocation can be used interchangeably with the keys. The following is equivalent to the usage above: cookbooks/apache2/attributes/default.rb This is a matter of style, and may be seen when "retrieving" the value of an attribute. Environment AttributesEnvironments can set attributes, which is a kind of Role AttributesRoles can only set Node AttributesFinally, the node object can be modified directly to set the attributes. Typically, this sets attributes at the JSON AttributesYou can also specify node attributes with a JSON file. These are applied at the For example, to set up some different ports for Apache to listen on: JSON attribute example Remember, that attributes passed via JSON file are merged with those stored on node and actually there is no way to override them in that way, however if there is a conflict, attributes from JSON file will win with those stored on node. How to Use AttributesGood candidates for Attributes are:
Usage Best PracticesThe general pattern for attributes precedence is that cookbooks and roles should be setting defaults. If you need to change the values for a specific node, use, the normal attributes on the node. Overrides are there so roles can force a certain value even if the node already has a value there. There are certainly other ways to use it, but that is the pattern it was designed for. Setting Attributes at the Same Precedence LevelA common use case is to set default attributes in a cookbook's attribute files, and also set the same default attributes, but with different values, using a role. In this scenario, the attributes set in the role will be deep merged on top of the attributes from the attributes file. The attributes set by the role will win if there is a conflict. Setting a Value Only If the Attribute Has No ValueIn attribute files, you can also set a value only if no value is currently set for that attribute using the |


7 Comments
Hide/Show CommentsAug 05, 2010
Edmund Haselwanter
there is a deep merge automatic attributes, right? e.g. if I set a node.ec2.mykey attribute, in any of my cookbooks and I'm NOT running on ec2 the test node.attributes?(:ec2) will get semantically incorrect. right?
Sep 22, 2010
Mike Conigliaro
Is there any way to UN-set an attribute?
Mar 23, 2011
Daniel DeLeo
In Chef 0.9.14+ you can use
deleteto remove an attribute.Oct 12, 2010
Mason Turner
Can I merge attributes? For example, if I want to build an auth.users.trusted hash that is populated by roles and nodes:
role a
auth.users.trusted => [ "bob" ]
role b
auth.users.trusted => [ "sue" ]
node c
auth.users.trusted => [ "armand" ]
I want the recipe would have access to:
auth.users.trusted => [ "bob" , "sue" , "armand" ]
Nov 01, 2010
Will Thames
Just use push, rather than assign
role a
auth.users.trusted.push("bob")
role b
auth.users.trusted.push("sue")
etc...
Nov 17, 2010
Michael Leinartas
Actually, arrays are handled by the deep merge as you have listed as long as the attributes in your role are override attributes. I believe if you were to instead use default attributes, only the attribute from the first role applied would appear and then only if it wasnt already set on the node by the recipe's attribute definitions (someone correct me if I'm wrong on this).
Jan 26, 2011
Simon Coffey
The precedence order given for attribute setting locations is rather confusing. Firstly, it doesn't specify whether it's ascending or descending, although this can be inferred from the subsequent table.
More importantly, however, it's rather ambiguous and arguably contradicts the table, listing attributes set in "cookbooks" as having lowest precedence, and those set in "nodes" as having the highest. Yet in the table, nodes and recipes have the highest precedence, and it's just cookbook attributes files that have lowest precedence. Yet recipes are the main part of cookbooks, aren't they?
Also, it might be helpful to note exactly how the attribute type and location precedences are combined; again, it was only by inference from the derived table that I could see that type precedence takes priority over location precedence.
(I'm not editing the page because I'm a total newbie, and am purely going on the information here; can an experienced user confirm I'm not talking complete cobblers?
)