Overwrite variables in template file with chef template command

Written by - 0 comments

Published on January 21st 2015 - Listed in Linux Chef Unix


A typical chef template definition would look like this:

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

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"
end

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.