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!
0 Kommentare