Verzweigungen / Bedingungen

Wie in anderen Programmier- oder Skriptsprachen stehen auch in Puppet Verzweigungen bzw. Bedingungen zur Verfügung.

Zur Veranschaulichung sehen wir uns das folgende Beispiel an.

class mymodule {
   if $operatingsystem == 'CentOS' {
      $service_name = 'httpd'

   } elsif $operatingsystem == 'Debian' {
      $service_name = 'apache2'
   }

   service { "apache-service":
      name => $service_name,
      ensure => "running",
      enable => true
   }
}

Erfahrungsgemäß verwenden CentOS und Debian unterschiedliche Namen für den Service des Apache Webservers. Daher haben wir den Namen des Services modular gestaltet.

Im Normalfall holt sich Puppet den Service Namen aus dem Ressourcennamen der Service Bedingung (hier: apache-service). Über den name Parameter lässt sich der Name des Services jedoch getrennt angeben.

Im folgenden Beispiel fügen wir noch einen Standard Fall ein. Dieser greift, wenn das Betriebssystem weder CentOS noch Debian basiert ist.

class mymodule {
   if $operatingsystem == 'CentOS' {
      $service_name = 'httpd'

   } elsif $operatingsystem == 'Debian' {
      $service_name = 'apache2'

   } else {
      $service_name = 'apache2'

   }

   service { "apache-service":
      name => $service_name,
      ensure => "running",
      enable => true
   }
}

Logische Operatoren

Natürlich lassen sich auch mehrere Bedingungen mit den Operatoren and und or vereinen.

if ($operatingsystem == 'RedHat') or ($operatingsystem == 'CentOS') { 
   $service_name = 'httpd'

} elsif ($operatingsystem == 'Debian') or ($operatingsystem == 'Ubuntu') { 
   $service_name = 'apache2'

}

Regular Expressions

If Verzweigungen lassen sich auch mit dem Operator =~ mit Regular Expressions kombinieren.

if $operatingsystem =~ /(RedHat|CentOS)/ {
   $service_name = 'httpd'

} elsif $operatingsystem =~ /(Debian|Ubuntu)/ {
   $service_name = 'apache2'

}

Case Verzweigungen

Etwas übersichtlicher und komfortabler werden solche Bedingungen durch die Verwendung von Case statements.

case $operatingsystem {
    'RedHat', 'CentOS': { $service_name = 'httpd' }
    /^(Debian|Ubuntu)$/:{ $service_name = 'apache2' }
    default:            { fail("Betriebssystem nicht unterstützt.") }
}

In Zeile 4 haben wir eine Regular Expression eingesetzt, welche das gleiche Ergebnis (nur für Debian / Ubuntu) liefert wie in Zeile 3.

Umgedrehtes If - Unless

Mit unless steht ein Sonderfall der if Funktion zur Verfügung. Dies funktioniert wie ein umgekehrtes If.

unless $memorysize > 4096 {
   $swap_size = $memorysize * 2
}

Übersetzt: Solange der Arbeitsspeicher 4096 MB nicht übersteigt, beträgt die größe der Swap-Datei das doppelte des Arbeitsspeichers.