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 %>
Innerhalb einer Datei stehen alle Variablen zur Verfügung, welche der Klasse übergeben wurden.
<%= @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 %>
Ablauf: Wenn die Variable ip_address
ungleich dem Wert NONE
ist, gebe die nachfolgende Zeile aus.
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.