Vor kurzem erst hatte ich darueber geschrieben, wie man in puppet ein eigenes Modul definiert.
Heute moechte ich zeigen, wie in einem Modul mit Templates, Variablen und if-Bedingung gearbeitet werden kann. Ich habe mir dafuer die Datei /etc/apt/sources.list ausgesucht in die ich – je nach Host – unterschiedliche Mirror eintragen moechte. Dafuer habe ich das Verzeichnis /etc/puppet/modules/apt/ mit der folgenden Ordnerstruktur angelegt:
├── manifests │ └── init.pp └── templates └── sources.list.erb |
Mein Template fuer die sources.list sieht wie folgt aus:
############################################################################# # # # !!! This file is managed by puppet, all manual changes will be lost !!! # # # ############################################################################# deb <%= mirror %> <%= release %> main <% if source -%> deb-src <%= mirror %> <%= release %> main <% end -%> deb http://security.debian.org/ <%= release %>/updates main <% if source -%> deb-src http://security.debian.org/ <%= release %>/updates main <% end -%> |
In dem Template kann man zwei Variablen erkennen. Diese sollen bei Bedarf ueberschrieben werden koennen <%= mirror -%> und <%= release %>. Ausserdem gibt es eine Bedingung, wenn die Variable source Wahr ist, wird auch die deb-src Zeile eingefuegt.
Die apt/manifests/init.pp fuer das Modul sieht wie folgt aus:
class apt ( $mirror = 'http://ftp.de.debian.org', $release = 'wheezy', $source = false ) { file { '/etc/apt/sources.list': ensure => 'present', owner => 'root', group => 'root', mode => '0644', content => template('apt/sources.list.erb'), } } |
Neu ist, dass in der Klassendefinition die Variablen mit entsprechenden Standardwerten definiert wurden. Das Bild wird komplett, wenn nun ein neuer Node in der sites.pp definiert wird:
node default { class { 'motd': } } node 'client02.example.org' inherits default { class { 'apt': mirror => 'http://debianmirror.example.org/pub/linux/debian/debian/', source => true } } |
Hier ist neu, dass der Node „client02.example.org“ explizit angegeben wurde. Er erbt die Einstellungen des default Node. Erweiternd ist die Klasse apt definiert, bei der die Variablen mirror und source einen anderen Wert annehmen als der Standartwert.
Ich bin mir dessen bewusst, dass es ein apt Modul auf puppetforge gibt, zum Lernen finde ich das hier gerade aber einfacher.
Informationen habe ich auch aus dem Blogeintrag „Puppet templates and default values for variables„.
Besten Dank für die Puppet Artikel! Das hat mich motiviert mich endlich auch mal
mit Puppet auseinanderzusetzen und ich „puppetifiziere“ gerade meine Hosts.
Hi Thomas,
mir mach das gerade auch viel Spass. Mein Blog als meine persoenliche Klowand dient mir dazu Notizen hinzukritzeln um es mir zu merken, aber auch um Dinge zu wiederholen und strukturiert noch einmal aufzuarbeiten. Schoen, dass Dir das hier gerade weiterhilft :-)
Cheers, Jan :-)