Search code examples
linuxtemplatesconfigurationpuppet

How to use a template for configuration file in Puppet


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.


Solution

  • 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.