Wednesday, September 13, 2017

chef-Node Attributes and the Precedence Game!

What are Attributes?

Attributes represent information about your node
§ The information can be auto-detected from the
node (e.g. # of CPUs, amount of RAM) &
populated by Ohai
§ You can also set attributes on your node using
cookbook recipes & attribute files, roles,
environments, etc
§ Attributes keep the program code separate from
data
§ All attributes are set on the "node object", and
are indexed for search on the server.

Attribute Sources

Attributes can be set at various levels (in
increasing order of precedence)
− Automagically on the node itself (by Ohai)
− In roles
− In environments
− In cookbook recipes
− In cookbook attribute files

Setting attributes in attribute files

Attributes can be set in the cookbook's
attributes file
− ./cookbooks/<cookbook>/attributes/default.rb

Format is

precedence  attribute name    attribute value

default["apache"]["dir"] = "/etc/apache2"


Setting Attributes in Recipes

They can also be set directly in Recipes

Precede attribute name with 'node.' as
follows

precedence
as a method attribute name attribute value
node.default["apache"]["dir"] = "/etc/apache2"

the node
object


More on attributes - Advanced!

An attribute value can be an array

default["apache"]["listen_ports"] = [ "80","443" ]

 Or it can be a hash

default["apache"]["site1"] = { "port" => 80 }
default["apache"]["site2"] = { "port" => 81 }
8


Never use array attributes

A terrible idea, nipped in the bud
§ An attribute value can be an array
default["apache"]["listen_ports"] = [ "80","443" ]
9
(its a trap)

important point:
It could be a hash. Hashes are great


default["apache"]["site1"] = { "port" => 80 }
default["apache"]["site2"] = { "port" => 81 }

The Problem and the Success Criteria
§ The Problem: We have defined our
'index.html' homepage in the recipe, but we
may want to change that without altering the
recipe
§ Success Criteria: We can change the
homepage by changing an attribute value





Exercise: Set attribute in attributes file

OPEN IN EDITOR: cookbooks/mysite/attributes/default.rb

default['mysite’]['indexfile'] = 'index1.html'

SAVE FILE!

Set an attribute to a specific value in the attributes
file

Exercise: Add index1.html to cookbook’s files/
default directory

OPEN IN EDITOR:

cookbooks/mysite/files/default/index1.html

<html>!
<title>Better Homepage for Gap, Inc.</title>!
<body>!
<h1>Welcome the Gap!</h1>!
<h2>Let’s sell some pants and shirts!</h2>!
<p>We configured this in the attributes file</p>!
</body>!
</html>!

Exercise: Set attribute in a recipe

OPEN IN EDITOR: cookbooks/mysite/recipes/default.rb

service "httpd" do
action [:enable, :start]
end
cookbook_file '/var/www/html/index.html' do
source node['mysite’]['indexfile']
mode '0644'
owner ‘nobody’
group ‘nobody
end

Exercise: Upload the cookbook

knife cookbook upload mysite

Uploading mysite [0.1.0]
Uploaded 1 cookbook.

Exercise: Set attribute in the recipe

OPEN IN EDITOR: cookbooks/mysite/recipes/default.rb

service "httpd" do
action [:enable, :start]
end
node.default[’mysite]['indexfile'] = 'index2.html'
cookbook_file '/var/www/html/index.html' do
source node[’mysite’][’indexfile’]
mode '0644'
owner ‘nobody’
group ‘nobody’
end

Exercise: Add index2.html to cookbook’s files/
default directory

OPEN IN EDITOR:cookbooks/mysite/files/default/index2.html

<html>
<title>Better Homepage for Gap,Inc</title>
<body>
<h1>It is SALE time at Gap!</h1>
<h2>Time for back to school.</h2>
<p>We configured this in the recipe</p>
</body>
</html>

Exercise: Upload the cookbook

knife cookbook upload mysite

Exercise: Viewing attributes using knife

$ knife node show node1 -l | more

...
§ Attributes:
§ tags:
§ Default Attributes:
§ apache:
§ indexfile: index2.html
§ Override Attributes:
§ Automatic Attributes (Ohai Data):
§ block_device:
§ dm-0:
§ removable: 0
§ size: 31563776
§ ...
2

Setting Attributes in Roles and Environments

Attributes can also be set in Roles and
Environments

These use raw JSON or Ruby format

default_attributes({"apache" => {"port" => 80}})










No comments:

Post a Comment