In Chef, how do I access attributes set in the environment JSON from cookbook attributes files?

Solution 1:

What does your environment file look like? Are you setting default or override attributes? If you're setting default, note that is a fairly low priority level in the attributes chain, so it might be overridden by a recipe, or a role.

The precedence of the attributes is as follows, from low to high:

  1. default attributes applied in an attributes file
  2. default attributes applied in an environment
  3. default attributes applied in a role
  4. default attributes applied on a node directly in a recipe
  5. normal or set attributes applied in an attributes file
  6. normal or set attributes applied on a node directly in a recipe
  7. override attributes applied in an attributes file
  8. override attributes applied in a role
  9. override attributes applied in an environment
  10. override attributes applied on a node directly in a recipe

Above from:

  • http://wiki.opscode.com/display/chef/Attributes

Solution 2:

Finally I was able to use environment's attribute in the Chef recipe. Lets say we have an environment like this:

{
  "name": "QA",
  "description": "QA environment",
  "cookbook_versions": {
  },
  "json_class": "Chef::Environment",
  "chef_type": "environment",
  "default_attributes": {
    "comp_rsyslog": {
      "filetag_env": "compqa"
    }
  },
  "override_attributes": {
  }
}

And we need to use the filetag_env attribute in the service's template config file to pass the environment attribute.

The way I do in the conf erb file it's like:

$InputFileTag <%= node['comp_rsyslog']['filetag_env'] %>,<%= node['rsyslog']['filetag1'] %>

The <%= node['rsyslog']['filetag1'] %> is defined in the recipe attribute's file:

default['rsyslog']['filetag1'] = 'comp_service'

The result will be a file in /etc/rsyslog.d/comp_service.conf with a content like:

$InputFileTag compqa,comp_service.