Overwrite variables in template file with chef template command

Written by - 0 comments

Published on - 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.

RSS feed

Blog Tags:

  AWS   Android   Ansible   Apache   Apple   Atlassian   BSD   Backup   Bash   Bluecoat   CMS   Chef   Cloud   Coding   Consul   Containers   CouchDB   DB   DNS   Database   Databases   Docker   ELK   Elasticsearch   Filebeat   FreeBSD   Galera   Git   GlusterFS   Grafana   Graphics   HAProxy   HTML   Hacks   Hardware   Icinga   Influx   Internet   Java   KVM   Kibana   Kodi   Kubernetes   LVM   LXC   Linux   Logstash   Mac   Macintosh   Mail   MariaDB   Minio   MongoDB   Monitoring   Multimedia   MySQL   NFS   Nagios   Network   Nginx   OSSEC   OTRS   Office   PGSQL   PHP   Perl   Personal   PostgreSQL   Postgres   PowerDNS   Proxmox   Proxy   Python   Rancher   Rant   Redis   Roundcube   SSL   Samba   Seafile   Security   Shell   SmartOS   Solaris   Surveillance   Systemd   TLS   Tomcat   Ubuntu   Unix   VMWare   VMware   Varnish   Virtualization   Windows   Wireless   Wordpress   Wyse   ZFS   Zoneminder