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:
- default attributes applied in an attributes file
- default attributes applied in an environment
- default attributes applied in a role
- default attributes applied on a node directly in a recipe
- normal or set attributes applied in an attributes file
- normal or set attributes applied on a node directly in a recipe
- override attributes applied in an attributes file
- override attributes applied in a role
- override attributes applied in an environment
- 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.