# # Puppet module for Apache # # This module is distributed under the GNU Affero General Public License: # # Backup module for puppet # Copyright (C) 2009 Sarava Group # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # # Using code from Debian Apache2 recipe: # # http://reductivelabs.com/trac/puppet/wiki/Recipes/DebianApache2Recipe # # TODO: log level, log files, etc $apache2_sites = "/etc/apache2/sites" $apache2_mods = "/etc/apache2/mods" $apache2_macros = "/etc/apache2/conf.d/macros" class apache { package { "apache": name => "apache2", ensure => installed, } package { "mod_macro": name => "libapache2-mod-macro", ensure => installed, } service { "apache": ensure => running, require => Package["apache"], hasstatus => true, hasrestart => true, } module { "macro": ensure => present, require => Package["mod_macro"], } # apache mod_macro configuration file { "${apache2_macros}": ensure => present, content => template('apache/macros.erb'), owner => root, group => root, mode => 0644, require => Module["macro"], notify => Service["apache"], } # prepare variables to use in templates case $apache_sites_folder { '': { $apache_sites_folder = '/var/www/sites' } } case $apache_www_folder { '': { $apache_www_folder = '/var/www' } } # TODO: ensure folders exist with right modes and ownership define site($ensure = present, $docroot = false, $redirect = false, $protocol = 'http', $server_alias = false, $use = false) { file { "${apache2_sites}-available/$title": ensure => $ensure, content => template('apache/website.erb'), owner => root, group => root, mode => 0644, require => File["${apache2_macros}"], notify => Service["apache"], } $status = $ensure ? { 'present' => "${apache2_sites}-available/$title", default => 'absent', } # Enable the site without a2ensite #file { "/etc/apache2/sites-enabled/$title": # ensure => $status, # owner => root, # group => root, # require => File["${apache2_sites}-available/$title"], # notify => Service["apache"], #} case $ensure { 'present': { exec { "/usr/sbin/a2ensite $name": unless => "/bin/sh -c '[ -L ${apache2_sites}-enabled/$name ] \ && [ ${apache2_sites}-enabled/$name -ef ${apache2_sites}-available/$name ]'", notify => Exec["reload-apache2"], require => Package[$require], } } 'absent': { exec { "/usr/sbin/a2dissite $name": onlyif => "/bin/sh -c '[ -L ${apache2_sites}-enabled/$name ] \ && [ ${apache2_sites}-enabled/$name -ef ${apache2_sites}-available/$name ]'", notify => Exec["reload-apache2"], require => Package["apache2"], } } default: { err ("Unknown ensure value: '$ensure'") } } } # Define an apache2 module. Debian packages place the module config # into /etc/apache2/mods-available. # # You can add a custom require (string) if the module depends on # packages that aren't part of the default apache2 package. Because of # the package dependencies, apache2 will automagically be included. define module($ensure = 'present') { case $ensure { 'present': { exec { "/usr/sbin/a2enmod $name": unless => "/bin/sh -c '[ -L ${apache2_mods}-enabled/${name}.load ] \ && [ ${apache2_mods}-enabled/${name}.load -ef ${apache2_mods}-available/${name}.load ]'", notify => Exec["force-reload-apache2"], } } 'absent': { exec { "/usr/sbin/a2dismod $name": onlyif => "/bin/sh -c '[ -L ${apache2_mods}-enabled/${name}.load ] \ && [ ${apache2_mods}-enabled/${name}.load -ef ${apache2_mods}-available/${name}.load ]'", notify => Exec["force-reload-apache2"], } } default: { err ("Unknown ensure value: '$ensure'") } } } # Notify this when apache needs a reload. This is only needed when # sites are added or removed, since a full restart then would be # a waste of time. When the module-config changes, a force-reload is # needed. exec { "reload-apache2": command => "/etc/init.d/apache2 reload", refreshonly => true, } exec { "force-reload-apache2": command => "/etc/init.d/apache2 force-reload", refreshonly => true, } }