17

I am new to Puppet and I am writing a module to setup configuration files. The problem is when multiple clients will be using my module they will have to edit it according to their system. I have heard that templates are way to solve this problem. But I am not able to get it how to use a template for setting up configuration file.

If anyone of you can give me a simple to follow example using templates to configure files would be really helpful. For example how can i setup Apache sites-available default configuration file using template, or give any other example you feel will help a new puppet user. BTW I am on Ubuntu machine.

maths
  • 1,399
  • 5
  • 23
  • 38

1 Answers1

25

The PuppetLabs docs on Using templates has an example of an Apache configuration for a Trac site. This should be enough to get you started.

Per OP's request, here's a simple example. I'm using NTP rather than the Apache default config since that's a fairly large and complex file. NTP is much simpler.

Directory looks like this:

/etc/puppet/modules/ntp/manifests
                       /templates

Partial contents /etc/puppet/modules/ntp/manifests/init.pp (just the portion defining the template):

$ntp_server_suffix = ".ubuntu.pool.ntp.org"

file { '/etc/ntp.conf':
    content => template('ntp/ntp.conf.erb'),
    owner   => root,
    group   => root,
    mode    => 644,
}

Contents of /etc/puppet/modules/ntp/templates/ntp.conf.erb:

driftfile /var/lib/ntp/drift
<% [1,2].each do |n| -%>
server <%=n-%><%=@ntp_server_suffix%>
<% end -%>

restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery
restrict 127.0.0.1

When run with puppet this will result in an /etc/ntp.conf that looks like:

driftfile /var/lib/ntp/drift
server 1.ubuntu.pool.ntp.org
server 2.ubuntu.pool.ntp.org

restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery
restrict 127.0.0.1

This demonstrates a few different concepts:

  1. Variables defined in the puppet manifest (such as $ntp_server_suffix can be accessed as instance variables (@ntp_server_suffix) in the template
  2. Loops and other ruby code can be used in erb templates
  3. Code between <% and %> is executed by ruby
  4. Code between <%= and %> is executed and output by ruby
  5. Code between <%= and -%> is executed and output by ruby and the trailing newline character is suppressed.

Hope this helps you understand templates.

Ben Whaley
  • 32,811
  • 7
  • 87
  • 85
  • thanks ben..:)... I looked on to the documentation its a little complex. Is there a small example you can suggest? Thanks – maths Apr 08 '14 at 22:34
  • awesome ben.. thanks alot.. that really gave me a good understanding of how templates work. I had to install ntp and then I compared it with how you are modifying it in the puppet code :)...thanks again.. – maths Apr 09 '14 at 17:02
  • Content line should be content => template('ntp/ntp.conf.erb') – dmourati Jul 17 '15 at 03:19