Header RSS Feed
If you only want to see the articles of a certain category, please click on the desired category below:
ALL Android Backup BSD Database Hacks Hardware Internet Linux Mail MySQL Monitoring Network Personal PHP Proxy Shell Solaris Unix Virtualization VMware Windows Wyse

Overwrite variables in template file with chef template command
Wednesday - Jan 21st 2015 - by - (0 comments)

A typical chef template definition would look like this:

template "/etc/motd" do
  source "motd.erb"
  owner "root"
  group "root"
  mode "0644"

While the template itself could look like this:

Hello and welcome to <%= node[:mycookbook][:systemname] %> !

To make this work, the variable [:mycookbook][:systemname] has to be defined somewhere. This could be in several places:

  • In the cookbooks (mycookbook) attribute file (for example attributes/default.rb) as a default attribute definition
  • As a default_attribute definition in a role or node definition (doesn't make sense in an environment definition for a systemname)
  • As an override_attribute in a role, environment or even node definition

But in certain scenarios this could cause a headache. For example when we have several nodes and all of them run the exact same role. The only difference is the recipe which is used to differ the nodes. When the variable is defined in the attribute files (attributes/host1.rb, attributes/host2.rb, etc.) the variables get mixed up.

cat attributes/host1.rb
default[:mycookbook][:systemname] = "host1"

cat attributes/host2.rb
default[:mycookbook][:systemname] = "host2"

All attribute files of the cookbook are read when chef runs and because the variable is always defined with the same name (node[:mycookbook][:systemname]), it cannot be guaranteed that the correct value is taken for the system. They overwrite themselves according to the order in which they are parsed by the chef run.

A fast and easy possibility to solve this is to set the variables directly in the recipe within the template command:

template "/etc/motd" do
  source "motd.erb"
  variables( :sysname => "host1" )
  owner "root"
  group "root"
  mode "0644"

With the variables line, special variables can be defined (here the variable sysname is set and given the value "host1") and sent directly to the template file. The template file in return needs to look a bit different to handle direct input from the template command:

Hello and welcome to <%= @sysname %> !

Now every node has its correct system name in the motd output, because every node uses its own recipe (in which the variable for the sysname is set).


Add a comment

Show form to leave a comment

Comments (newest first):

No comments yet.

Go to Homepage home
Linux Howtos how to's
Monitoring Plugins monitoring plugins
Links links

Valid HTML 4.01 Transitional
Valid CSS!
[Valid RSS]

6938 Days
until Death of Computers