War es bisher mit Puppet notwendig über eine Defined Ressource zu iterieren, ist dies nun in Puppet 4 in einer normalen Klasse möglich.
Als Beispiel nehmen wir eine internationale Firma. Diese Firma hat auf Ihrem Webserver Webseiten für Deutschland, England und Frankreich. nun möchte man für bestimmte Virtual Hosts den Webroot in dem die Seite liegt evtl. an einer anderen Stelle haben.

Dazu definieren wir einen Hash über den wir anschließend iterieren werden.

Folgender Hash kommt aus Hiera:

nginx::vhost::vhosts:
  'www.firma.de':
    webroot_ensure: 'present'
    web_root_directory: '/var/www/www.firma.de'
  'www.firma.co.uk':
    webroot_ensure: 'present'
    web_root_directory: '/var/www/www.firma.co.uk'
  'www.firma.fr':
    webroot_ensure: 'present'
    web_root_directory: '/opt/www/www.firma.fr'

Und hier der Puppetcode:

class nginx::vhost(
  Hash $vhosts = hiera_hash('nginx::vhost::vhosts', {}),
){
 
  file { ['/var/www', '/opt/www']:
    ensure  => directory,
    owner   => 'www-data'
    group   => 'www-data'
    mode    => '0755'
  }
 
  $vhosts.each |$key, $value| {
    $vhost_name = $key
    $webroot_ensure = $value['webroot_ensure']
    $web_root_directory = $value['web_root_directory']
 
 
    if $webroot_ensure == 'present' {
      $create_webroot = 'directory'
      $force_webroot = false
      $webroot_action = 'creating'
    }
    elsif $webroot_ensure == 'absent' {
      $create_webroot = 'absent'
      $force_webroot = true
      $webroot_action = 'removing'
    }
    else {
      fail("Unknown value ${webroot_ensure} for parameter 'webroot_ensure'")
    }
 
    file { "${webroot_action} Webroot ${web_root_directory} for ${vhost_name}":
      path    => $web_root_directory,
      ensure  => $create_webroot,
      force   => $force_webroot,
      owner   => 'www-data'
      group   => 'www-data'
      mode    => '0755'
    }
  }
}

Mit $vhosts.each wird über jedes Hash-Element iteriert. Der Key ist dabei der Domainname. In $value stehen dann die jeweiligen Unterschlüssel. Mit $value[‘Unterschlüssel’] greift man auf den Wert des jeweiligen Unterschlüssels im Hash zu.

Die Möglichkeit Schleifen in normalen Klassen zu nutzen ist definitiv eine der nützlichsten Neuerungen in der Puppet DSL. Viel Spass beim ausprobieren!

Simon Hönscheid

Autor: Simon Hönscheid

Simon ist in der Nähe von Köln geboren und lebt seit einigen Jahren in Berlin. Er arbeitet bei NETWAYS als Senior Consultant und hat schon während der Ausbildung zum Fachinformatiker für Systemintegration die Themen Automatisierung, Monitoring, Backup und Wissenstransfer für sich entdeckt. Wenn er grade nicht arbeitet macht er gerne Sport, Fotografiert, hört Musik oder lernt neue Dinge.