Puppet-Modul: Apache

Ein neues Puppet-Modul bringt Funktion. Für denn Fall, dass man bei PuppetForge nicht fündig wird, kann man sich auch selbst so ein Modul erstellen. Hier ist ein kleines Beispiel; ein ganz einfaches HTTP-Modul.

Zuerst muss natürlich das Modul erstellt werden.

/etc/puppetlabs/code/environments/production/modules
pdk new module apache
cd apache

init.pp

Jedes Modul benötigt den Einstieg über "init.pp".

pdk new class apache
# A description of what this class does
#
# @summary A short summary of the purpose of this class
#
# @example
#   include apache
class apache inherits apache::params {
  package { $::apache::params::mypackage:
    ensure => installed,
  }

  service { $::apache::params::myservice:
    ensure  => running,
    enable  => true,
    require => Package[$::apache::params::mypackage],
  }
}

param.pp

Die Parameter werden in diesem Beispiel durch die Klasse 'params' ausgeliefert.

pdk new class params
# A description of what this class does
#
# @summary A short summary of the purpose of this class
#
# @example
#   include apache::params
class apache::params {
  if $::fqdn {
    $servername = $::fqdn
  } else {
    $servername = $::hostname
  }

  if $::osfamily == 'RedHat' {
    $mypackage = 'httpd'
    $myservice = 'httpd'
    $myuser = 'apache'
    $mygroup = 'apache'
    $vhostdir = '/etc/httpd/conf.d'
  } elsif $::osfamily == 'Suse' {
    $mypackage = 'apache2'
    $myservice = 'apache2'
    $myuser = 'wwwrun'
    $mygroup = 'www'
    $vhostdir = '/etc/apache2/vhosts.d'
  } else {
    fail('os not supported')
  }
}

vhosts.pp

Die eigentliche Funktionalität befindet sich in dieser Klasse.

pdk new defined_type vhosts
# A description of what this defined type does
#
# @summary A short summary of the purpose of this defined type.
#
# @example
#   apache::vhosts { 'namevar': }
define apache::vhosts(String $servername, Integer $port, String $docroot) {

  include apache
  include apache::params

  file { 'VHost-Datei anlegen':
    ensure  => file,
    path    => "${::apache::params::vhostdir}/${servername}.conf",
    owner   => $::apache::params::myuser,
    group   => $::apache::params::mygroup,
    mode    => '0644',
    content => epp('apache/vhost.epp', {'servername' => $servername, 'port' => $port, 'docroot' => $docroot}),
    require => Package[$::apache::params::mypackage],
    notify  => Service[$::apache::params::myservice],
  }
}

site.pp

Schlussendlich muss der Puppet-Client natürlich noch sein Apache-Modul bekommen. Dafür sei hier die "site.pp" verwandt.

node 'puppet-client.domain.local' {
  class { 'apache': }
  
  file { '/etc/motd':
    ensure  => file,
    content => "Super WebServer, Junge!\n",
  }
}

Dieses Beispiel ist zwar eher als Vorlage gedacht, sollte nun jedoch durchaus funktionieren.