Datei Templates

In diesem Abschnitt kommen wir zu den Templates. Im Grunde sind diese mit den bereits bekannten File Ressourcen vergleichbar, lassen sich jedoch über Variablen anpassen.

Als Beispiel verwenden wir hier eine NTP Konfiguration. Um den verwendeten NTP Server möglichst variabel zu halten, packen wir die IP Adresse in eine Variable. Die Klasse sieht also wie folgt aus.

class ntp ($ip_address) {
   package { 'ntp':
      ensure => present
   }

   file { '/etc/ntp.conf':
      mode        => "644",
      content     => template('ntp/ntp.conf.erb'),
      require     => Package['ntp'],
      notify      => Service['ntpd']
   }

   service { 'ntpd':
      ensure      => running,
      enable      => true,
   }
}

Zunächst erstellen wir hierzu eine neue Datei innerhalb der gewünschten Klasse. In unserem Fall verwenden wir eine NTP Konfiguration. Das Template wird in den Ordner templates/ gelegt.

nano templates/httpd.conf.erb

Wichtig ist hier die Endung .erb, welche signalisiert, dass es sich bei der Datei um ein Template mit entsprechenden Variablen handelt. Der Inhalt sieht wie folgt aus.

driftfile /var/lib/ntp/ntp.drift
server <%= @ip_address %>

<%= @ip_address %> wird durch die IP Adresse ersetzt, die wir dem Puppet Modul im Aufruf übergeben.

node foo.bar { 
   class { 'ntp':
      "ip_address" => "192.168.1.1"
   }
}

Arrays

Das NTP Beispiel eignet sich sehr schön zur Demonstration weiterer Features von Puppet zum Thema Templates. In der Regel sollte man zur Redundanz mehrere NTP Server vergeben. Dies lässt sich sehr leicht mittels eines Arrays lösen. Zunächst übergeben wir der Klasse ntp ein Array.

node foo.bar { 
   class { 'ntp':
      "ip_address" => ["192.168.1.1", "192.168.2.1", "192.168.3.1"]
   }
}

Anschließend muss das Template ebenfalls angepasst werden, sodass es auch Arrays verarbeiten kann.

driftfile /var/lib/ntp/ntp.drift

<% @ip_address.each do |element| -%>
server <%= element %>
<% end -%>

In dieser Schleife wird nun für jede IP Adresse aus dem Array eine neue Zeile angelegt.

Verzweigungen

Neben Arrays sind auch Verzweigungen in Puppet Templates möglich. Hierzu sehen wir uns das folgende Beispiel an.

<% if @ip_address != "NONE" %>
server <%= @ip_address %>
<% end %>

Kombination mehrerer Templates

Bei größeren Dateien oder verschiedenen Komponenten, kann es notwendig sein mehrere Templates zu einer Datei zu vereinen. Dies ist wie folgt möglich.

class ntp ($ip_address) {

   package { 'ntp': 
      ensure => present 
   }

   file { '/etc/ntp.conf': 
      mode        => "644",
      content     => template('ntp/ntp_teil1.conf.erb', 'ntp/ntp_teil2.conf.erb'),
      require     => Package['ntp'],
      notify      => Service['ntpd']
   }

   service { 'ntpd': 
      ensure      => running, 
      enable      => true,
   }

}

Die Datei /etc/ntp.conf wird damit aus den zwei Templates ntpteil1.conf.erb und ntpteil2.conf.erb zusammengesetzt.