Update directory structure & allow to configure paths (tmp, log, cache)

This commit is contained in:
Nicolas Le Goff
2014-09-05 11:28:25 +02:00
parent 69fd50906f
commit de7988689e
2201 changed files with 850 additions and 13650 deletions

View File

@@ -0,0 +1,6 @@
fixtures:
repositories:
stdlib: "git://github.com/puppetlabs/puppetlabs-stdlib.git"
concat: "git://github.com/puppetlabs/puppetlabs-concat.git"
symlinks:
apache: "#{source_dir}"

View File

@@ -0,0 +1,31 @@
---
default_set: 'centos-64-x64'
sets:
'centos-59-x64':
nodes:
"main.foo.vm":
prefab: 'centos-59-x64'
'centos-64-x64':
nodes:
"main.foo.vm":
prefab: 'centos-64-x64'
'fedora-18-x64':
nodes:
"main.foo.vm":
prefab: 'fedora-18-x64'
'debian-607-x64':
nodes:
"main.foo.vm":
prefab: 'debian-607-x64'
'debian-70rc1-x64':
nodes:
"main.foo.vm":
prefab: 'debian-70rc1-x64'
'ubuntu-server-10044-x64':
nodes:
"main.foo.vm":
prefab: 'ubuntu-server-10044-x64'
'ubuntu-server-12042-x64':
nodes:
"main.foo.vm":
prefab: 'ubuntu-server-12042-x64'

View File

@@ -0,0 +1,5 @@
--no-single_quote_string_with_variables-check
--no-80chars-check
--no-class_inherits_from_params_class-check
--no-class_parameter_defaults-check
--no-documentation-check

View File

@@ -0,0 +1,32 @@
---
branches:
only:
- master
language: ruby
bundler_args: --without development
script: "bundle exec rake spec SPEC_OPTS='--format documentation'"
rvm:
- 1.8.7
- 1.9.3
- 2.0.0
env:
matrix:
- PUPPET_GEM_VERSION="~> 2.7.0" FACTER_GEM_VERSION="~> 1.6.0"
- PUPPET_GEM_VERSION="~> 2.7.0" FACTER_GEM_VERSION="~> 1.7.0"
- PUPPET_GEM_VERSION="~> 3.0"
- PUPPET_GEM_VERSION="~> 3.5.0" STRICT_VARIABLES="yes"
matrix:
fast_finish: true
exclude:
- rvm: 1.9.3
env: PUPPET_GEM_VERSION="~> 2.7.0" FACTER_GEM_VERSION="~> 1.6.0"
- rvm: 1.9.3
env: PUPPET_GEM_VERSION="~> 2.7.0" FACTER_GEM_VERSION="~> 1.7.0"
- rvm: 2.0.0
env: PUPPET_GEM_VERSION="~> 2.7.0" FACTER_GEM_VERSION="~> 1.6.0"
- rvm: 2.0.0
env: PUPPET_GEM_VERSION="~> 2.7.0" FACTER_GEM_VERSION="~> 1.7.0"
- rvm: 1.8.7
env: PUPPET_GEM_VERSION="~> 3.2.0"
notifications:
email: false

View File

@@ -0,0 +1,246 @@
## 2014-03-04 Supported Release 1.0.1
###Summary
This is a supported release. This release removes a testing symlink that can
cause trouble on systems where /var is on a seperate filesystem from the
modulepath.
####Features
####Bugfixes
####Known Bugs
* By default, the version of Apache that ships with Ubuntu 10.04 does not work with `wsgi_import_script`.
* SLES is unsupported.
## 2014-03-04 Supported Release 1.0.0
###Summary
This is a supported release. This release introduces Apache 2.4 support for
Debian and RHEL based osfamilies.
####Features
- Add apache24 support
- Add rewrite_base functionality to rewrites
- Updated README documentation
- Add WSGIApplicationGroup and WSGIImportScript directives
####Bugfixes
- Replace mutating hashes with merge() for Puppet 3.5
- Fix WSGI import_script and mod_ssl issues on Lucid
####Known Bugs
* By default, the version of Apache that ships with Ubuntu 10.04 does not work with `wsgi_import_script`.
* SLES is unsupported.
---
## 2014-01-31 Release 0.11.0
### Summary:
This release adds preliminary support for Windows compatibility and multiple rewrite support.
#### Backwards-incompatible Changes:
- The rewrite_rule parameter is deprecated in favor of the new rewrite parameter
and will be removed in a future release.
#### Features:
- add Match directive
- quote paths for windows compatibility
- add auth_group_file option to README.md
- allow AuthGroupFile directive for vhosts
- Support Header directives in vhost context
- Don't purge mods-available dir when separate enable dir is used
- Fix the servername used in log file name
- Added support for mod_include
- Remove index parameters.
- Support environment variable control for CustomLog
- added redirectmatch support
- Setting up the ability to do multiple rewrites and conditions.
- Convert spec tests to beaker.
- Support php_admin_(flag|value)s
#### Bugfixes:
- directories are either a Hash or an Array of Hashes
- Configure Passenger in separate .conf file on RH so PassengerRoot isn't lost
- (docs) Update list of `apache::mod::[name]` classes
- (docs) Fix apache::namevirtualhost example call style
- Fix $ports_file reference in apache::listen.
- Fix $ports_file reference in Namevirtualhost.
## 2013-12-05 Release 0.10.0
### Summary:
This release adds FreeBSD osfamily support and various other improvements to some mods.
#### Features:
- Add suPHP_UserGroup directive to directory context
- Add support for ScriptAliasMatch directives
- Set SSLOptions StdEnvVars in server context
- No implicit <Directory> entry for ScriptAlias path
- Add support for overriding ErrorDocument
- Add support for AliasMatch directives
- Disable default "allow from all" in vhost-directories
- Add WSGIPythonPath as an optional parameter to mod_wsgi.
- Add mod_rpaf support
- Add directives: IndexOptions, IndexOrderDefault
- Add ability to include additional external configurations in vhost
- need to use the provider variable not the provider key value from the directory hash for matches
- Support for FreeBSD and few other features
- Add new params to apache::mod::mime class
- Allow apache::mod to specify module id and path
- added $server_root parameter
- Add Allow and ExtendedStatus support to mod_status
- Expand vhost/_directories.pp directive support
- Add initial support for nss module (no directives in vhost template yet)
- added peruser and event mpms
- added $service_name parameter
- add parameter for TraceEnable
- Make LogLevel configurable for server and vhost
- Add documentation about $ip
- Add ability to pass ip (instead of wildcard) in default vhost files
#### Bugfixes:
- Don't listen on port or set NameVirtualHost for non-existent vhost
- only apply Directory defaults when provider is a directory
- Working mod_authnz_ldap support on Debian/Ubuntu
## 2013-09-06 Release 0.9.0
### Summary:
This release adds more parameters to the base apache class and apache defined
resource to make the module more flexible. It also adds or enhances SuPHP,
WSGI, and Passenger mod support, and support for the ITK mpm module.
#### Backwards-incompatible Changes:
- Remove many default mods that are not normally needed.
- Remove `rewrite_base` `apache::vhost` parameter; did not work anyway.
- Specify dependencies on stdlib >=2.4.0 (this was already the case, but
making explicit)
- Deprecate `a2mod` in favor of the `apache::mod::*` classes and `apache::mod`
defined resource.
#### Features:
- `apache` class
- Add `httpd_dir` parameter to change the location of the configuration
files.
- Add `logroot` parameter to change the logroot
- Add `ports_file` parameter to changes the `ports.conf` file location
- Add `keepalive` parameter to enable persistent connections
- Add `keepalive_timeout` parameter to change the timeout
- Update `default_mods` to be able to take an array of mods to enable.
- `apache::vhost`
- Add `wsgi_daemon_process`, `wsgi_daemon_process_options`,
`wsgi_process_group`, and `wsgi_script_aliases` parameters for per-vhost
WSGI configuration.
- Add `access_log_syslog` parameter to enable syslogging.
- Add `error_log_syslog` parameter to enable syslogging of errors.
- Add `directories` hash parameter. Please see README for documentation.
- Add `sslproxyengine` parameter to enable SSLProxyEngine
- Add `suphp_addhandler`, `suphp_engine`, and `suphp_configpath` for
configuring SuPHP.
- Add `custom_fragment` parameter to allow for arbitrary apache
configuration injection. (Feature pull requests are prefered over using
this, but it is available in a pinch.)
- Add `apache::mod::suphp` class for configuring SuPHP.
- Add `apache::mod::itk` class for configuring ITK mpm module.
- Update `apache::mod::wsgi` class for global WSGI configuration with
`wsgi_socket_prefix` and `wsgi_python_home` parameters.
- Add README.passenger.md to document the `apache::mod::passenger` usage.
Added `passenger_high_performance`, `passenger_pool_idle_time`,
`passenger_max_requests`, `passenger_stat_throttle_rate`, `rack_autodetect`,
and `rails_autodetect` parameters.
- Separate the httpd service resource into a new `apache::service` class for
dependency chaining of `Class['apache'] -> <resource> ~>
Class['apache::service']`
- Added `apache::mod::proxy_balancer` class for `apache::balancer`
#### Bugfixes:
- Change dependency to puppetlabs-concat
- Fix ruby 1.9 bug for `a2mod`
- Change servername to be `$::hostname` if there is no `$::fqdn`
- Make `/etc/ssl/certs` the default ssl certs directory for RedHat non-5.
- Make `php` the default php package for RedHat non-5.
- Made `aliases` able to take a single alias hash instead of requiring an
array.
## 2013-07-26 Release 0.8.1
#### Bugfixes:
- Update `apache::mpm_module` detection for worker/prefork
- Update `apache::mod::cgi` and `apache::mod::cgid` detection for
worker/prefork
## 2013-07-16 Release 0.8.0
#### Features:
- Add `servername` parameter to `apache` class
- Add `proxy_set` parameter to `apache::balancer` define
#### Bugfixes:
- Fix ordering for multiple `apache::balancer` clusters
- Fix symlinking for sites-available on Debian-based OSs
- Fix dependency ordering for recursive confdir management
- Fix `apache::mod::*` to notify the service on config change
- Documentation updates
## 2013-07-09 Release 0.7.0
#### Changes:
- Essentially rewrite the module -- too many to list
- `apache::vhost` has many abilities -- see README.md for details
- `apache::mod::*` classes provide httpd mod-loading capabilities
- `apache` base class is much more configurable
#### Bugfixes:
- Many. And many more to come
## 2013-03-2 Release 0.6.0
- update travis tests (add more supported versions)
- add access log_parameter
- make purging of vhost dir configurable
## 2012-08-24 Release 0.4.0
#### Changes:
- `include apache` is now required when using `apache::mod::*`
#### Bugfixes:
- Fix syntax for validate_re
- Fix formatting in vhost template
- Fix spec tests such that they pass
##2012-05-08 Puppet Labs <info@puppetlabs.com> - 0.0.4
* e62e362 Fix broken tests for ssl, vhost, vhost::*
* 42c6363 Changes to match style guide and pass puppet-lint without error
* 42bc8ba changed name => path for file resources in order to name namevar by it's name
* 72e13de One end too much
* 0739641 style guide fixes: 'true' <> true, $operatingsystem needs to be $::operatingsystem, etc.
* 273f94d fix tests
* a35ede5 (#13860) Make a2enmod/a2dismo commands optional
* 98d774e (#13860) Autorequire Package['httpd']
* 05fcec5 (#13073) Add missing puppet spec tests
* 541afda (#6899) Remove virtual a2mod definition
* 976cb69 (#13072) Move mod python and wsgi package names to params
* 323915a (#13060) Add .gitignore to repo
* fdf40af (#13060) Remove pkg directory from source tree
* fd90015 Add LICENSE file and update the ModuleFile
* d3d0d23 Re-enable local php class
* d7516c7 Make management of firewalls configurable for vhosts
* 60f83ba Explicitly lookup scope of apache_name in templates.
* f4d287f (#12581) Add explicit ordering for vdir directory
* 88a2ac6 (#11706) puppetlabs-apache depends on puppetlabs-firewall
* a776a8b (#11071) Fix to work with latest firewall module
* 2b79e8b (#11070) Add support for Scientific Linux
* 405b3e9 Fix for a2mod
* 57b9048 Commit apache::vhost::redirect Manifest
* 8862d01 Commit apache::vhost::proxy Manifest
* d5c1fd0 Commit apache::mod::wsgi Manifest
* a825ac7 Commit apache::mod::python Manifest
* b77062f Commit Templates
* 9a51b4a Vhost File Declarations
* 6cf7312 Defaults for Parameters
* 6a5b11a Ensure installed
* f672e46 a2mod fix
* 8a56ee9 add pthon support to apache

View File

@@ -0,0 +1,234 @@
Checklist (and a short version for the impatient)
=================================================
* Commits:
- Make commits of logical units.
- Check for unnecessary whitespace with "git diff --check" before
committing.
- Commit using Unix line endings (check the settings around "crlf" in
git-config(1)).
- Do not check in commented out code or unneeded files.
- The first line of the commit message should be a short
description (50 characters is the soft limit, excluding ticket
number(s)), and should skip the full stop.
- Associate the issue in the message. The first line should include
the issue number in the form "(#XXXX) Rest of message".
- The body should provide a meaningful commit message, which:
- uses the imperative, present tense: "change", not "changed" or
"changes".
- includes motivation for the change, and contrasts its
implementation with the previous behavior.
- Make sure that you have tests for the bug you are fixing, or
feature you are adding.
- Make sure the test suites passes after your commit:
`bundle exec rspec spec/acceptance` More information on [testing](#Testing) below
- When introducing a new feature, make sure it is properly
documented in the README.md
* Submission:
* Pre-requisites:
- Sign the [Contributor License Agreement](https://cla.puppetlabs.com/)
- Make sure you have a [GitHub account](https://github.com/join)
- [Create a ticket](http://projects.puppetlabs.com/projects/modules/issues/new), or [watch the ticket](http://projects.puppetlabs.com/projects/modules/issues) you are patching for.
* Preferred method:
- Fork the repository on GitHub.
- Push your changes to a topic branch in your fork of the
repository. (the format ticket/1234-short_description_of_change is
usually preferred for this project).
- Submit a pull request to the repository in the puppetlabs
organization.
The long version
================
1. Make separate commits for logically separate changes.
Please break your commits down into logically consistent units
which include new or changed tests relevant to the rest of the
change. The goal of doing this is to make the diff easier to
read for whoever is reviewing your code. In general, the easier
your diff is to read, the more likely someone will be happy to
review it and get it into the code base.
If you are going to refactor a piece of code, please do so as a
separate commit from your feature or bug fix changes.
We also really appreciate changes that include tests to make
sure the bug is not re-introduced, and that the feature is not
accidentally broken.
Describe the technical detail of the change(s). If your
description starts to get too long, that is a good sign that you
probably need to split up your commit into more finely grained
pieces.
Commits which plainly describe the things which help
reviewers check the patch and future developers understand the
code are much more likely to be merged in with a minimum of
bike-shedding or requested changes. Ideally, the commit message
would include information, and be in a form suitable for
inclusion in the release notes for the version of Puppet that
includes them.
Please also check that you are not introducing any trailing
whitespace or other "whitespace errors". You can do this by
running "git diff --check" on your changes before you commit.
2. Sign the Contributor License Agreement
Before we can accept your changes, we do need a signed Puppet
Labs Contributor License Agreement (CLA).
You can access the CLA via the [Contributor License Agreement link](https://cla.puppetlabs.com/)
If you have any questions about the CLA, please feel free to
contact Puppet Labs via email at cla-submissions@puppetlabs.com.
3. Sending your patches
To submit your changes via a GitHub pull request, we _highly_
recommend that you have them on a topic branch, instead of
directly on "master".
It makes things much easier to keep track of, especially if
you decide to work on another thing before your first change
is merged in.
GitHub has some pretty good
[general documentation](http://help.github.com/) on using
their site. They also have documentation on
[creating pull requests](http://help.github.com/send-pull-requests/).
In general, after pushing your topic branch up to your
repository on GitHub, you can switch to the branch in the
GitHub UI and click "Pull Request" towards the top of the page
in order to open a pull request.
4. Update the related GitHub issue.
If there is a GitHub issue associated with the change you
submitted, then you should update the ticket to include the
location of your branch, along with any other commentary you
may wish to make.
Testing
=======
Getting Started
---------------
Our puppet modules provide [`Gemfile`](./Gemfile)s which can tell a ruby
package manager such as [bundler](http://bundler.io/) what Ruby packages,
or Gems, are required to build, develop, and test this software.
Please make sure you have [bundler installed](http://bundler.io/#getting-started)
on your system, then use it to install all dependencies needed for this project,
by running
```shell
% bundle install
Fetching gem metadata from https://rubygems.org/........
Fetching gem metadata from https://rubygems.org/..
Using rake (10.1.0)
Using builder (3.2.2)
-- 8><-- many more --><8 --
Using rspec-system-puppet (2.2.0)
Using serverspec (0.6.3)
Using rspec-system-serverspec (1.0.0)
Using bundler (1.3.5)
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
```
NOTE some systems may require you to run this command with sudo.
If you already have those gems installed, make sure they are up-to-date:
```shell
% bundle update
```
With all dependencies in place and up-to-date we can now run the tests:
```shell
% rake spec
```
This will execute all the [rspec tests](http://rspec-puppet.com/) tests
under [spec/defines](./spec/defines), [spec/classes](./spec/classes),
and so on. rspec tests may have the same kind of dependencies as the
module they are testing. While the module defines in its [Modulefile](./Modulefile),
rspec tests define them in [.fixtures.yml](./fixtures.yml).
Some puppet modules also come with [beaker](https://github.com/puppetlabs/beaker)
tests. These tests spin up a virtual machine under
[VirtualBox](https://www.virtualbox.org/)) with, controlling it with
[Vagrant](http://www.vagrantup.com/) to actually simulate scripted test
scenarios. In order to run these, you will need both of those tools
installed on your system.
You can run them by issuing the following command
```shell
% rake spec_clean
% rspec spec/acceptance
```
This will now download a pre-fabricated image configured in the [default node-set](./spec/acceptance/nodesets/default.yml),
install puppet, copy this module and install its dependencies per [spec/spec_helper_acceptance.rb](./spec/spec_helper_acceptance.rb)
and then run all the tests under [spec/acceptance](./spec/acceptance).
Writing Tests
-------------
XXX getting started writing tests.
If you have commit access to the repository
===========================================
Even if you have commit access to the repository, you will still need to
go through the process above, and have someone else review and merge
in your changes. The rule is that all changes must be reviewed by a
developer on the project (that did not write the code) to ensure that
all changes go through a code review process.
Having someone other than the author of the topic branch recorded as
performing the merge is the record that they performed the code
review.
Additional Resources
====================
* [Getting additional help](http://projects.puppetlabs.com/projects/puppet/wiki/Getting_Help)
* [Writing tests](http://projects.puppetlabs.com/projects/puppet/wiki/Development_Writing_Tests)
* [Patchwork](https://patchwork.puppetlabs.com)
* [Contributor License Agreement](https://projects.puppetlabs.com/contributor_licenses/sign)
* [General GitHub documentation](http://help.github.com/)
* [GitHub pull request documentation](http://help.github.com/send-pull-requests/)

View File

@@ -0,0 +1,26 @@
source ENV['GEM_SOURCE'] || "https://rubygems.org"
group :development, :test do
gem 'rake', '10.1.1', :require => false
gem 'rspec-puppet', '>=1.0.0', :require => false
gem 'puppetlabs_spec_helper', :require => false
gem 'serverspec', :require => false
gem 'puppet-lint', :require => false
gem 'beaker', :require => false
gem 'beaker-rspec', :require => false
gem 'rspec', '~> 2.11', :require => false
end
if facterversion = ENV['FACTER_GEM_VERSION']
gem 'facter', facterversion, :require => false
else
gem 'facter', :require => false
end
if puppetversion = ENV['PUPPET_GEM_VERSION']
gem 'puppet', puppetversion, :require => false
else
gem 'puppet', :require => false
end
# vim:ft=ruby

View File

@@ -0,0 +1,15 @@
Copyright (C) 2012 Puppet Labs Inc
Puppet Labs can be contacted at: info@puppetlabs.com
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@@ -0,0 +1,12 @@
name 'puppetlabs-apache'
version '1.0.1'
source 'git://github.com/puppetlabs/puppetlabs-apache.git'
author 'puppetlabs'
license 'Apache 2.0'
summary 'Puppet module for Apache'
description 'Module for Apache configuration'
project_page 'https://github.com/puppetlabs/puppetlabs-apache'
## Add dependencies, if any:
dependency 'puppetlabs/stdlib', '>= 2.4.0'
dependency 'puppetlabs/concat', '>= 1.0.0'

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,278 @@
# Passenger
Just enabling the Passenger module is insufficient for the use of Passenger in
production. Passenger should be tunable to better fit the environment in which
it is run while being aware of the resources it required.
To this end the Apache passenger module has been modified to apply system wide
Passenger tuning declarations to `passenger.conf`. Declarations specific to a
virtual host should be passed through when defining a `vhost` (e.g.
`rack_base_uris` parameter on the `apache::vhost` type, check `README.md`).
Also, general apache module loading parameters can be supplied to enable using
a customized passenger module in place of a default-package-based version of
the module.
# Operating system support and Passenger versions
The most important configuration directive for the Apache Passenger module is
`PassengerRoot`. Its value depends on the Passenger version used (2.x, 3.x or
4.x) and on the operating system package from which the Apache Passenger module
is installed.
The following table summarises the current *default versions* and
`PassengerRoot` settings for the operating systems supported by
puppetlabs-apache:
OS | Passenger version | `PassengerRoot`
---------------- | ------------------ | ----------------
Debian 7 | 3.0.13 | /usr
Ubuntu 12.04 | 2.2.11 | /usr
Ubuntu 14.04 | 4.0.37 | /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini
RHEL with EPEL6 | 3.0.21 | /usr/lib/ruby/gems/1.8/gems/passenger-3.0.21
As mentioned in `README.md` there are no compatible packages available for
RHEL/CentOS 5 or RHEL/CentOS 7.
## Configuration files and locations on RHEL/CentOS
Notice two important points:
1. The Passenger version packaged in the EPEL repositories may change over time.
2. The value of `PassengerRoot` depends on the Passenger version installed.
To prevent the puppetlabs-apache module from having to keep up with these
package versions the Passenger configuration files installed by the
packages are left untouched by this module. All configuration is placed in an
extra configuration file managed by puppetlabs-apache.
This means '/etc/httpd/conf.d/passenger.conf' is installed by the
`mod_passenger` package and contains correct values for `PassengerRoot` and
`PassengerRuby`. Puppet will ignore this file. Additional configuration
directives as described in the remainder of this document are placed in
'/etc/httpd/conf.d/passenger_extra.conf', managed by Puppet.
This pertains *only* to RHEL/CentOS, *not* Debian and Ubuntu.
## Third-party and custom Passenger packages and versions
The Passenger version distributed by the default OS packages may be too old to
be useful. Newer versions may be installed via Gems, from source or from
third-party OS packages.
Most notably the Passenger developers officially provide Debian packages for a
variety of Debian and Ubuntu releases in the [Passenger APT
repository](https://oss-binaries.phusionpassenger.com/apt/passenger). Read more
about [installing these packages in the offical user
guide](http://www.modrails.com/documentation/Users%20guide%20Apache.html#install_on_debian_ubuntu).
If you install custom Passenger packages and newer version make sure to set the
directives `PassengerRoot`, `PassengerRuby` and/or `PassengerDefaultRuby`
correctly, or Passenger and Apache will fail to function properly.
For Passenger 4.x packages on Debian and Ubuntu the `PassengerRoot` directive
should almost universally be set to
`/usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini`.
# Parameters for `apache::mod::passenger`
The following class parameters configure Passenger in a global, server-wide
context.
Example:
```puppet
class { 'apache::mod::passenger':
passenger_root => '/usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini',
passenger_default_ruby => '/usr/bin/ruby1.9.3',
passenger_high_performance => 'on',
rails_autodetect => 'off',
mod_lib_path => '/usr/lib/apache2/custom_modules',
}
```
The general form is using the all lower-case version of the configuration
directive, with underscores instead of CamelCase.
## Parameters used with passenger.conf
If you pass a default value to `apache::mod::passenger` it will be ignored and
not passed through to the configuration file.
### passenger_root
The location to the Phusion Passenger root directory. This configuration option
is essential to Phusion Passenger, and allows Phusion Passenger to locate its
own data files.
The default depends on the Passenger version and the means of installation. See
the above section on operating system support, versions and packages for more
information.
http://www.modrails.com/documentation/Users%20guide%20Apache.html#_passengerroot_lt_directory_gt
### passenger_default_ruby
This option specifies the default Ruby interpreter to use for web apps as well
as for all sorts of internal Phusion Passenger helper scripts, e.g. the one
used by PassengerPreStart.
This directive was introduced in Passenger 4.0.0 and will not work in versions
< 4.x. Do not set this parameter if your Passenger version is older than 4.0.0.
Defaults to `undef` for all operating systems except Ubuntu 14.04, where it is
set to '/usr/bin/ruby'.
http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerDefaultRuby
### passenger_ruby
This directive is the same as `passenger_default_ruby` for Passenger versions
< 4.x and must be used instead of `passenger_default_ruby` for such versions.
It makes no sense to set `PassengerRuby` for Passenger >= 4.x. That
directive should only be used to override the value of `PassengerDefaultRuby`
on a non-global context, i.e. in `<VirtualHost>`, `<Directory>`, `<Location>`
and so on.
Defaults to `/usr/bin/ruby` for all supported operating systems except Ubuntu
14.04, where it is set to `undef`.
http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerRuby
### passenger_high_performance
Default is `off`. When turned `on` Passenger runs in a higher performance mode
that can be less compatible with other Apache modules.
http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerHighPerformance
### passenger_max_pool_size
Sets the maximum number of Passenger application processes that may
simultaneously run. The default value is 6.
http://www.modrails.com/documentation/Users%20guide%20Apache.html#_passengermaxpoolsize_lt_integer_gt
### passenger_pool_idle_time
The maximum number of seconds a Passenger Application process will be allowed
to remain idle before being shut down. The default value is 300.
http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerPoolIdleTime
### passenger_max_requests
The maximum number of request a Passenger application will process before being
restarted. The default value is 0, which indicates that a process will only
shut down if the Pool Idle Time (see above) expires.
http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerMaxRequests
### passenger_stat_throttle_rate
Sets how often Passenger performs file system checks, at most once every _x_
seconds. Default is 0, which means the checks are performed with every request.
http://www.modrails.com/documentation/Users%20guide%20Apache.html#_passengerstatthrottlerate_lt_integer_gt
### rack_autodetect
Should Passenger automatically detect if the document root of a virtual host is
a Rack application. Not set by default (`undef`). Note that this directive has
been removed in Passenger 4.0.0 and `PassengerEnabled` should be used instead.
Use this directive only on Passenger < 4.x.
http://www.modrails.com/documentation/Users%20guide%20Apache.html#_rackautodetect_lt_on_off_gt
### rails_autodetect
Should Passenger automatically detect if the document root of a virtual host is
a Rails application. Not set by default (`undef`). Note that this directive
has been removed in Passenger 4.0.0 and `PassengerEnabled` should be used
instead. Use this directive only on Passenger < 4.x.
http://www.modrails.com/documentation/Users%20guide%20Apache.html#_railsautodetect_lt_on_off_gt
### passenger_use_global_queue
Allows toggling of PassengerUseGlobalQueue. NOTE: PassengerUseGlobalQueue is
the default in Passenger 4.x and the versions >= 4.x have disabled this
configuration option altogether. Use with caution.
## Parameters used to load the module
Unlike the tuning parameters specified above, the following parameters are only
used when loading customized passenger modules.
### mod_package
Allows overriding the default package name used for the passenger module
package.
### mod_package_ensure
Allows overriding the package installation setting used by puppet when
installing the passenger module. The default is 'present'.
### mod_id
Allows overriding the value used by apache to identify the passenger module.
The default is 'passenger_module'.
### mod_lib_path
Allows overriding the directory path used by apache when loading the passenger
module. The default is the value of `$apache::params::lib_path`.
### mod_lib
Allows overriding the library file name used by apache when loading the
passenger module. The default is 'mod_passenger.so'.
### mod_path
Allows overriding the full path to the library file used by apache when loading
the passenger module. The default is the concatenation of the `mod_lib_path`
and `mod_lib` parameters.
# Dependencies
RedHat-based systems will need to configure additional package repositories in
order to install Passenger, specifically:
* [Extra Packages for Enterprise Linux](https://fedoraproject.org/wiki/EPEL)
* [Phusion Passenger](http://passenger.stealthymonkeys.com)
Configuration of these repositories is beyond the scope of this module and is
left to the user.
# Attribution
The Passenger tuning parameters for the `apache::mod::passenger` Puppet class
was modified by Aaron Hicks (hicksa@landcareresearch.co.nz) for work on the
NeSI Project and the Tuakiri New Zealand Access Federation as a fork from the
PuppetLabs Apache module on GitHub.
* https://github.com/puppetlabs/puppetlabs-apache
* https://github.com/nesi/puppetlabs-apache
* http://www.nesi.org.nz//
* https://tuakiri.ac.nz/confluence/display/Tuakiri/Home
# Copyright and License
Copyright (C) 2012 [Puppet Labs](https://www.puppetlabs.com/) Inc
Puppet Labs can be contacted at: info@puppetlabs.com
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@@ -0,0 +1,10 @@
require 'puppetlabs_spec_helper/rake_tasks'
require 'puppet-lint/tasks/puppet-lint'
PuppetLint.configuration.fail_on_warnings
PuppetLint.configuration.send('disable_80chars')
PuppetLint.configuration.send('disable_class_inherits_from_params_class')
PuppetLint.configuration.send('disable_class_parameter_defaults')
PuppetLint.configuration.send('disable_documentation')
PuppetLint.configuration.send('disable_single_quote_string_with_variables')
PuppetLint.configuration.ignore_paths = ["spec/**/*.pp", "pkg/**/*.pp"]

View File

@@ -0,0 +1,24 @@
# Configuration file for the httpd service.
#
# The default processing model (MPM) is the process-based
# 'prefork' model. A thread-based model, 'worker', is also
# available, but does not work with some modules (such as PHP).
# The service must be stopped before changing this variable.
#
#HTTPD=/usr/sbin/httpd.worker
#
# To pass additional options (for instance, -D definitions) to the
# httpd binary at startup, set OPTIONS here.
#
#OPTIONS=
#OPTIONS=-DDOWN
#
# By default, the httpd process is started in the C locale; to
# change the locale in which the server runs, the HTTPD_LANG
# variable can be set.
#
#HTTPD_LANG=C
export SHORTHOST=`hostname -s`

View File

@@ -0,0 +1,34 @@
class Puppet::Provider::A2mod < Puppet::Provider
def self.prefetch(mods)
instances.each do |prov|
if mod = mods[prov.name]
mod.provider = prov
end
end
end
def flush
@property_hash.clear
end
def properties
if @property_hash.empty?
@property_hash = query || {:ensure => :absent}
@property_hash[:ensure] = :absent if @property_hash.empty?
end
@property_hash.dup
end
def query
self.class.instances.each do |mod|
if mod.name == self.name or mod.name.downcase == self.name
return mod.properties
end
end
nil
end
def exists?
properties[:ensure] != :absent
end
end

View File

@@ -0,0 +1,35 @@
require 'puppet/provider/a2mod'
Puppet::Type.type(:a2mod).provide(:a2mod, :parent => Puppet::Provider::A2mod) do
desc "Manage Apache 2 modules on Debian and Ubuntu"
optional_commands :encmd => "a2enmod"
optional_commands :discmd => "a2dismod"
commands :apache2ctl => "apache2ctl"
confine :osfamily => :debian
defaultfor :operatingsystem => [:debian, :ubuntu]
def self.instances
modules = apache2ctl("-M").lines.collect { |line|
m = line.match(/(\w+)_module \(shared\)$/)
m[1] if m
}.compact
modules.map do |mod|
new(
:name => mod,
:ensure => :present,
:provider => :a2mod
)
end
end
def create
encmd resource[:name]
end
def destroy
discmd resource[:name]
end
end

View File

@@ -0,0 +1,116 @@
require 'puppet/util/filetype'
Puppet::Type.type(:a2mod).provide(:gentoo, :parent => Puppet::Provider) do
desc "Manage Apache 2 modules on Gentoo"
confine :operatingsystem => :gentoo
defaultfor :operatingsystem => :gentoo
attr_accessor :property_hash
def create
@property_hash[:ensure] = :present
end
def exists?
(!(@property_hash[:ensure].nil?) and @property_hash[:ensure] == :present)
end
def destroy
@property_hash[:ensure] = :absent
end
def flush
self.class.flush
end
class << self
attr_reader :conf_file
end
def self.clear
@mod_resources = []
@modules = []
@other_args = ""
end
def self.initvars
@conf_file = "/etc/conf.d/apache2"
@filetype = Puppet::Util::FileType.filetype(:flat).new(conf_file)
@mod_resources = []
@modules = []
@other_args = ""
end
self.initvars
# Retrieve an array of all existing modules
def self.modules
if @modules.length <= 0
# Locate the APACHE_OPTS variable
records = filetype.read.split(/\n/)
apache2_opts = records.grep(/^\s*APACHE2_OPTS=/).first
# Extract all defines
while apache2_opts.sub!(/-D\s+(\w+)/, '')
@modules << $1.downcase
end
# Hang on to any remaining options.
if apache2_opts.match(/APACHE2_OPTS="(.+)"/)
@other_args = $1.strip
end
@modules.sort!.uniq!
end
@modules
end
def self.prefetch(resources={})
# Match resources with existing providers
instances.each do |provider|
if resource = resources[provider.name]
resource.provider = provider
end
end
# Store all resources using this provider for flushing
resources.each do |name, resource|
@mod_resources << resource
end
end
def self.instances
modules.map {|mod| new(:name => mod, :provider => :gentoo, :ensure => :present)}
end
def self.flush
mod_list = modules
mods_to_remove = @mod_resources.select {|mod| mod.should(:ensure) == :absent}.map {|mod| mod[:name]}
mods_to_add = @mod_resources.select {|mod| mod.should(:ensure) == :present}.map {|mod| mod[:name]}
mod_list -= mods_to_remove
mod_list += mods_to_add
mod_list.sort!.uniq!
if modules != mod_list
opts = @other_args + " "
opts << mod_list.map {|mod| "-D #{mod.upcase}"}.join(" ")
opts.strip!
opts.gsub!(/\s+/, ' ')
apache2_opts = %Q{APACHE2_OPTS="#{opts}"}
Puppet.debug("Writing back \"#{apache2_opts}\" to #{conf_file}")
records = filetype.read.split(/\n/)
opts_index = records.find_index {|i| i.match(/^\s*APACHE2_OPTS/)}
records[opts_index] = apache2_opts
filetype.backup
filetype.write(records.join("\n"))
@modules = mod_list
end
end
end

View File

@@ -0,0 +1,12 @@
Puppet::Type.type(:a2mod).provide :modfix do
desc "Dummy provider for A2mod.
Fake nil resources when there is no crontab binary available. Allows
puppetd to run on a bootstrapped machine before a Cron package has been
installed. Workaround for: http://projects.puppetlabs.com/issues/2384
"
def self.instances
[]
end
end

View File

@@ -0,0 +1,60 @@
require 'puppet/provider/a2mod'
Puppet::Type.type(:a2mod).provide(:redhat, :parent => Puppet::Provider::A2mod) do
desc "Manage Apache 2 modules on RedHat family OSs"
commands :apachectl => "apachectl"
confine :osfamily => :redhat
defaultfor :osfamily => :redhat
require 'pathname'
# modpath: Path to default apache modules directory /etc/httpd/mod.d
# modfile: Path to module load configuration file; Default: resides under modpath directory
# libfile: Path to actual apache module library. Added in modfile LoadModule
attr_accessor :modfile, :libfile
class << self
attr_accessor :modpath
def preinit
@modpath = "/etc/httpd/mod.d"
end
end
self.preinit
def create
File.open(modfile,'w') do |f|
f.puts "LoadModule #{resource[:identifier]} #{libfile}"
end
end
def destroy
File.delete(modfile)
end
def self.instances
modules = apachectl("-M").lines.collect { |line|
m = line.match(/(\w+)_module \(shared\)$/)
m[1] if m
}.compact
modules.map do |mod|
new(
:name => mod,
:ensure => :present,
:provider => :redhat
)
end
end
def modfile
modfile ||= "#{self.class.modpath}/#{resource[:name]}.load"
end
# Set libfile path: If absolute path is passed, then maintain it. Else, make it default from 'modules' dir.
def libfile
libfile = Pathname.new(resource[:lib]).absolute? ? resource[:lib] : "modules/#{resource[:lib]}"
end
end

View File

@@ -0,0 +1,30 @@
Puppet::Type.newtype(:a2mod) do
@doc = "Manage Apache 2 modules"
ensurable
newparam(:name) do
Puppet.warning "The a2mod provider is deprecated, please use apache::mod instead"
desc "The name of the module to be managed"
isnamevar
end
newparam(:lib) do
desc "The name of the .so library to be loaded"
defaultto { "mod_#{@resource[:name]}.so" }
end
newparam(:identifier) do
desc "Module identifier string used by LoadModule. Default: module-name_module"
# http://httpd.apache.org/docs/2.2/mod/module-dict.html#ModuleIdentifier
defaultto { "#{resource[:name]}_module" }
end
autorequire(:package) { catalog.resource(:package, 'httpd')}
end

View File

@@ -0,0 +1,83 @@
# == Define Resource Type: apache::balancer
#
# This type will create an apache balancer cluster file inside the conf.d
# directory. Each balancer cluster needs one or more balancer members (that can
# be declared with the apache::balancermember defined resource type). Using
# storeconfigs, you can export the apache::balancermember resources on all
# balancer members, and then collect them on a single apache load balancer
# server.
#
# === Requirement/Dependencies:
#
# Currently requires the puppetlabs/concat module on the Puppet Forge and uses
# storeconfigs on the Puppet Master to export/collect resources from all
# balancer members.
#
# === Parameters
#
# [*name*]
# The namevar of the defined resource type is the balancer clusters name.
# This name is also used in the name of the conf.d file
#
# [*proxy_set*]
# Hash, default empty. If given, each key-value pair will be used as a ProxySet
# line in the configuration.
#
# [*collect_exported*]
# Boolean, default 'true'. True means 'collect exported @@balancermember
# resources' (for the case when every balancermember node exports itself),
# false means 'rely on the existing declared balancermember resources' (for the
# case when you know the full set of balancermembers in advance and use
# apache::balancermember with array arguments, which allows you to deploy
# everything in 1 run)
#
#
# === Examples
#
# Exporting the resource for a balancer member:
#
# apache::balancer { 'puppet00': }
#
define apache::balancer (
$proxy_set = {},
$collect_exported = true,
) {
include concat::setup
include ::apache::mod::proxy_balancer
$target = "${::apache::params::confd_dir}/balancer_${name}.conf"
concat { $target:
owner => '0',
group => '0',
mode => '0644',
notify => Service['httpd'],
}
concat::fragment { "00-${name}-header":
ensure => present,
target => $target,
order => '01',
content => "<Proxy balancer://${name}>\n",
}
if $collect_exported {
Apache::Balancermember <<| balancer_cluster == $name |>>
}
# else: the resources have been created and they introduced their
# concat fragments. We don't have to do anything about them.
concat::fragment { "01-${name}-proxyset":
ensure => present,
target => $target,
order => '19',
content => inline_template("<% proxy_set.keys.sort.each do |key| %> Proxyset <%= key %>=<%= proxy_set[key] %>\n<% end %>"),
}
concat::fragment { "01-${name}-footer":
ensure => present,
target => $target,
order => '20',
content => "</Proxy>\n",
}
}

View File

@@ -0,0 +1,53 @@
# == Define Resource Type: apache::balancermember
#
# This type will setup a balancer member inside a listening service
# configuration block in /etc/apache/apache.cfg on the load balancer.
# currently it only has the ability to specify the instance name, url and an
# array of options. More features can be added as needed. The best way to
# implement this is to export this resource for all apache balancer member
# servers, and then collect them on the main apache load balancer.
#
# === Requirement/Dependencies:
#
# Currently requires the puppetlabs/concat module on the Puppet Forge and
# uses storeconfigs on the Puppet Master to export/collect resources
# from all balancer members.
#
# === Parameters
#
# [*name*]
# The title of the resource is arbitrary and only utilized in the concat
# fragment name.
#
# [*balancer_cluster*]
# The apache service's instance name (or, the title of the apache::balancer
# resource). This must match up with a declared apache::balancer resource.
#
# [*url*]
# The url used to contact the balancer member server.
#
# [*options*]
# An array of options to be specified after the url.
#
# === Examples
#
# Exporting the resource for a balancer member:
#
# @@apache::balancermember { 'apache':
# balancer_cluster => 'puppet00',
# url => "ajp://${::fqdn}:8009"
# options => ['ping=5', 'disablereuse=on', 'retry=5', 'ttl=120'],
# }
#
define apache::balancermember(
$balancer_cluster,
$url = "http://${::fqdn}/",
$options = [],
) {
concat::fragment { "BalancerMember ${url}":
ensure => present,
target => "${::apache::params::confd_dir}/balancer_${balancer_cluster}.conf",
content => inline_template(" BalancerMember ${url} <%= @options.join ' ' %>\n"),
}
}

View File

@@ -0,0 +1,10 @@
class apache::confd::no_accf {
# Template uses no variables
file { 'no-accf.conf':
ensure => 'file',
path => "${::apache::confd_dir}/no-accf.conf",
content => template('apache/confd/no-accf.conf.erb'),
require => Exec["mkdir ${::apache::confd_dir}"],
before => File[$::apache::confd_dir],
}
}

View File

@@ -0,0 +1,15 @@
class apache::default_confd_files (
$all = true,
) {
# The rest of the conf.d/* files only get loaded if we want them
if $all {
case $::osfamily {
'freebsd': {
include ::apache::confd::no_accf
}
default: {
# do nothing
}
}
}
}

View File

@@ -0,0 +1,158 @@
class apache::default_mods (
$all = true,
$mods = undef,
$apache_version = $::apache::apache_version
) {
# These are modules required to run the default configuration.
# They are not configurable at this time, so we just include
# them to make sure it works.
case $::osfamily {
'redhat', 'freebsd': {
::apache::mod { 'log_config': }
if versioncmp($apache_version, '2.4') >= 0 {
# Lets fork it
::apache::mod { 'systemd': }
::apache::mod { 'unixd': }
}
}
default: {}
}
::apache::mod { 'authz_host': }
# The rest of the modules only get loaded if we want all modules enabled
if $all {
case $::osfamily {
'debian': {
include ::apache::mod::reqtimeout
}
'redhat': {
include ::apache::mod::actions
include ::apache::mod::cache
include ::apache::mod::mime
include ::apache::mod::mime_magic
include ::apache::mod::vhost_alias
include ::apache::mod::suexec
include ::apache::mod::rewrite
include ::apache::mod::speling
::apache::mod { 'auth_digest': }
::apache::mod { 'authn_anon': }
::apache::mod { 'authn_dbm': }
::apache::mod { 'authz_dbm': }
::apache::mod { 'authz_owner': }
::apache::mod { 'expires': }
::apache::mod { 'ext_filter': }
::apache::mod { 'include': }
::apache::mod { 'logio': }
::apache::mod { 'substitute': }
::apache::mod { 'usertrack': }
::apache::mod { 'version': }
if versioncmp($apache_version, '2.4') >= 0 {
::apache::mod { 'authn_core': }
}
else {
::apache::mod { 'authn_alias': }
::apache::mod { 'authn_default': }
}
}
'freebsd': {
include ::apache::mod::actions
include ::apache::mod::cache
include ::apache::mod::disk_cache
include ::apache::mod::headers
include ::apache::mod::info
include ::apache::mod::mime_magic
include ::apache::mod::reqtimeout
include ::apache::mod::rewrite
include ::apache::mod::userdir
include ::apache::mod::vhost_alias
include ::apache::mod::speling
::apache::mod { 'asis': }
::apache::mod { 'auth_digest': }
::apache::mod { 'authn_alias': }
::apache::mod { 'authn_anon': }
::apache::mod { 'authn_dbm': }
::apache::mod { 'authn_default': }
::apache::mod { 'authz_dbm': }
::apache::mod { 'authz_owner': }
::apache::mod { 'cern_meta': }
::apache::mod { 'charset_lite': }
::apache::mod { 'dumpio': }
::apache::mod { 'expires': }
::apache::mod { 'file_cache': }
::apache::mod { 'filter':}
::apache::mod { 'imagemap':}
::apache::mod { 'include': }
::apache::mod { 'logio': }
::apache::mod { 'unique_id': }
::apache::mod { 'usertrack': }
::apache::mod { 'version': }
}
default: {}
}
case $::apache::mpm_module {
'prefork': {
include ::apache::mod::cgi
}
'worker': {
include ::apache::mod::cgid
}
default: {
# do nothing
}
}
include ::apache::mod::alias
include ::apache::mod::autoindex
include ::apache::mod::dav
include ::apache::mod::dav_fs
include ::apache::mod::deflate
include ::apache::mod::dir
include ::apache::mod::mime
include ::apache::mod::negotiation
include ::apache::mod::setenvif
::apache::mod { 'auth_basic': }
::apache::mod { 'authn_file': }
if versioncmp($apache_version, '2.4') >= 0 {
# authz_core is needed for 'Require' directive
::apache::mod { 'authz_core':
id => 'authz_core_module',
}
# filter is needed by mod_deflate
::apache::mod { 'filter': }
# lots of stuff seems to break without access_compat
::apache::mod { 'access_compat': }
} else {
::apache::mod { 'authz_default': }
}
::apache::mod { 'authz_groupfile': }
::apache::mod { 'authz_user': }
::apache::mod { 'env': }
} elsif $mods {
::apache::default_mods::load { $mods: }
if versioncmp($apache_version, '2.4') >= 0 {
# authz_core is needed for 'Require' directive
::apache::mod { 'authz_core':
id => 'authz_core_module',
}
# filter is needed by mod_deflate
::apache::mod { 'filter': }
}
} else {
if versioncmp($apache_version, '2.4') >= 0 {
# authz_core is needed for 'Require' directive
::apache::mod { 'authz_core':
id => 'authz_core_module',
}
# filter is needed by mod_deflate
::apache::mod { 'filter': }
}
}
}

View File

@@ -0,0 +1,8 @@
# private define
define apache::default_mods::load ($module = $title) {
if defined("apache::mod::${module}") {
include "::apache::mod::${module}"
} else {
::apache::mod { $module: }
}
}

View File

@@ -0,0 +1,11 @@
class apache::dev {
if $::osfamily == 'FreeBSD' and !defined(Class['apache::package']) {
fail('apache::dev requires apache::package; please include apache or apache::package class first')
}
include ::apache::params
$packages = $::apache::params::dev_packages
package { $packages:
ensure => present,
require => Package['httpd'],
}
}

View File

@@ -0,0 +1,340 @@
# Class: apache
#
# This class installs Apache
#
# Parameters:
#
# Actions:
# - Install Apache
# - Manage Apache service
#
# Requires:
#
# Sample Usage:
#
class apache (
$service_name = $::apache::params::service_name,
$default_mods = true,
$default_vhost = true,
$default_confd_files = true,
$default_ssl_vhost = false,
$default_ssl_cert = $::apache::params::default_ssl_cert,
$default_ssl_key = $::apache::params::default_ssl_key,
$default_ssl_chain = undef,
$default_ssl_ca = undef,
$default_ssl_crl_path = undef,
$default_ssl_crl = undef,
$ip = undef,
$service_enable = true,
$service_ensure = 'running',
$purge_configs = true,
$purge_vdir = false,
$serveradmin = 'root@localhost',
$sendfile = 'On',
$error_documents = false,
$timeout = '120',
$httpd_dir = $::apache::params::httpd_dir,
$server_root = $::apache::params::server_root,
$confd_dir = $::apache::params::confd_dir,
$vhost_dir = $::apache::params::vhost_dir,
$vhost_enable_dir = $::apache::params::vhost_enable_dir,
$mod_dir = $::apache::params::mod_dir,
$mod_enable_dir = $::apache::params::mod_enable_dir,
$mpm_module = $::apache::params::mpm_module,
$conf_template = $::apache::params::conf_template,
$servername = $::apache::params::servername,
$manage_user = true,
$manage_group = true,
$user = $::apache::params::user,
$group = $::apache::params::group,
$keepalive = $::apache::params::keepalive,
$keepalive_timeout = $::apache::params::keepalive_timeout,
$max_keepalive_requests = $apache::params::max_keepalive_requests,
$logroot = $::apache::params::logroot,
$log_level = $::apache::params::log_level,
$log_formats = {},
$ports_file = $::apache::params::ports_file,
$apache_version = $::apache::version::default,
$server_tokens = 'OS',
$server_signature = 'On',
$trace_enable = 'On',
$package_ensure = 'installed',
) inherits ::apache::params {
validate_bool($default_vhost)
validate_bool($default_ssl_vhost)
validate_bool($default_confd_files)
# true/false is sufficient for both ensure and enable
validate_bool($service_enable)
$valid_mpms_re = $apache_version ? {
'2.4' => '(event|itk|peruser|prefork|worker)',
default => '(event|itk|prefork|worker)'
}
if $mpm_module {
validate_re($mpm_module, $valid_mpms_re)
}
# NOTE: on FreeBSD it's mpm module's responsibility to install httpd package.
# NOTE: the same strategy may be introduced for other OSes. For this, you
# should delete the 'if' block below and modify all MPM modules' manifests
# such that they include apache::package class (currently event.pp, itk.pp,
# peruser.pp, prefork.pp, worker.pp).
if $::osfamily != 'FreeBSD' {
package { 'httpd':
ensure => $package_ensure,
name => $::apache::params::apache_name,
notify => Class['Apache::Service'],
}
}
validate_re($sendfile, [ '^[oO]n$' , '^[oO]ff$' ])
# declare the web server user and group
# Note: requiring the package means the package ought to create them and not puppet
validate_bool($manage_user)
if $manage_user {
user { $user:
ensure => present,
gid => $group,
require => Package['httpd'],
}
}
validate_bool($manage_group)
if $manage_group {
group { $group:
ensure => present,
require => Package['httpd']
}
}
$valid_log_level_re = '(emerg|alert|crit|error|warn|notice|info|debug)'
validate_re($log_level, $valid_log_level_re,
"Log level '${log_level}' is not one of the supported Apache HTTP Server log levels.")
class { '::apache::service':
service_name => $service_name,
service_enable => $service_enable,
service_ensure => $service_ensure,
}
# Deprecated backwards-compatibility
if $purge_vdir {
warning('Class[\'apache\'] parameter purge_vdir is deprecated in favor of purge_configs')
$purge_confd = $purge_vdir
} else {
$purge_confd = $purge_configs
}
Exec {
path => '/bin:/sbin:/usr/bin:/usr/sbin',
}
exec { "mkdir ${confd_dir}":
creates => $confd_dir,
require => Package['httpd'],
}
file { $confd_dir:
ensure => directory,
recurse => true,
purge => $purge_confd,
notify => Class['Apache::Service'],
require => Package['httpd'],
}
if ! defined(File[$mod_dir]) {
exec { "mkdir ${mod_dir}":
creates => $mod_dir,
require => Package['httpd'],
}
# Don't purge available modules if an enable dir is used
$purge_mod_dir = $purge_configs and !$mod_enable_dir
file { $mod_dir:
ensure => directory,
recurse => true,
purge => $purge_mod_dir,
notify => Class['Apache::Service'],
require => Package['httpd'],
}
}
if $mod_enable_dir and ! defined(File[$mod_enable_dir]) {
$mod_load_dir = $mod_enable_dir
exec { "mkdir ${mod_enable_dir}":
creates => $mod_enable_dir,
require => Package['httpd'],
}
file { $mod_enable_dir:
ensure => directory,
recurse => true,
purge => $purge_configs,
notify => Class['Apache::Service'],
require => Package['httpd'],
}
} else {
$mod_load_dir = $mod_dir
}
if ! defined(File[$vhost_dir]) {
exec { "mkdir ${vhost_dir}":
creates => $vhost_dir,
require => Package['httpd'],
}
file { $vhost_dir:
ensure => directory,
recurse => true,
purge => $purge_configs,
notify => Class['Apache::Service'],
require => Package['httpd'],
}
}
if $vhost_enable_dir and ! defined(File[$vhost_enable_dir]) {
$vhost_load_dir = $vhost_enable_dir
exec { "mkdir ${vhost_load_dir}":
creates => $vhost_load_dir,
require => Package['httpd'],
}
file { $vhost_enable_dir:
ensure => directory,
recurse => true,
purge => $purge_configs,
notify => Class['Apache::Service'],
require => Package['httpd'],
}
} else {
$vhost_load_dir = $vhost_dir
}
concat { $ports_file:
owner => 'root',
group => $::apache::params::root_group,
mode => '0644',
notify => Class['Apache::Service'],
require => Package['httpd'],
}
concat::fragment { 'Apache ports header':
ensure => present,
target => $ports_file,
content => template('apache/ports_header.erb')
}
if $::apache::params::conf_dir and $::apache::params::conf_file {
case $::osfamily {
'debian': {
$docroot = '/var/www'
$pidfile = '${APACHE_PID_FILE}'
$error_log = 'error.log'
$error_documents_path = '/usr/share/apache2/error'
$scriptalias = '/usr/lib/cgi-bin'
$access_log_file = 'access.log'
}
'redhat': {
$docroot = '/var/www/html'
$pidfile = 'run/httpd.pid'
$error_log = 'error_log'
$error_documents_path = '/var/www/error'
$scriptalias = '/var/www/cgi-bin'
$access_log_file = 'access_log'
}
'freebsd': {
$docroot = '/usr/local/www/apache22/data'
$pidfile = '/var/run/httpd.pid'
$error_log = 'httpd-error.log'
$error_documents_path = '/usr/local/www/apache22/error'
$scriptalias = '/usr/local/www/apache22/cgi-bin'
$access_log_file = 'httpd-access.log'
}
default: {
fail("Unsupported osfamily ${::osfamily}")
}
}
$apxs_workaround = $::osfamily ? {
'freebsd' => true,
default => false
}
# Template uses:
# - $pidfile
# - $user
# - $group
# - $logroot
# - $error_log
# - $sendfile
# - $mod_dir
# - $ports_file
# - $confd_dir
# - $vhost_dir
# - $error_documents
# - $error_documents_path
# - $apxs_workaround
# - $keepalive
# - $keepalive_timeout
# - $max_keepalive_requests
# - $server_root
# - $server_tokens
# - $server_signature
# - $trace_enable
file { "${::apache::params::conf_dir}/${::apache::params::conf_file}":
ensure => file,
content => template($conf_template),
notify => Class['Apache::Service'],
require => Package['httpd'],
}
# preserve back-wards compatibility to the times when default_mods was
# only a boolean value. Now it can be an array (too)
if is_array($default_mods) {
class { '::apache::default_mods':
all => false,
mods => $default_mods,
}
} else {
class { '::apache::default_mods':
all => $default_mods,
}
}
class { '::apache::default_confd_files':
all => $default_confd_files
}
if $mpm_module {
class { "::apache::mod::${mpm_module}": }
}
$default_vhost_ensure = $default_vhost ? {
true => 'present',
false => 'absent'
}
$default_ssl_vhost_ensure = $default_ssl_vhost ? {
true => 'present',
false => 'absent'
}
::apache::vhost { 'default':
ensure => $default_vhost_ensure,
port => 80,
docroot => $docroot,
scriptalias => $scriptalias,
serveradmin => $serveradmin,
access_log_file => $access_log_file,
priority => '15',
ip => $ip,
}
$ssl_access_log_file = $::osfamily ? {
'freebsd' => $access_log_file,
default => "ssl_${access_log_file}",
}
::apache::vhost { 'default-ssl':
ensure => $default_ssl_vhost_ensure,
port => 443,
ssl => true,
docroot => $docroot,
scriptalias => $scriptalias,
serveradmin => $serveradmin,
access_log_file => $ssl_access_log_file,
priority => '15',
ip => $ip,
}
}
}

View File

@@ -0,0 +1,10 @@
define apache::listen {
$listen_addr_port = $name
# Template uses: $listen_addr_port
concat::fragment { "Listen ${listen_addr_port}":
ensure => present,
target => $::apache::ports_file,
content => template('apache/listen.erb'),
}
}

View File

@@ -0,0 +1,130 @@
define apache::mod (
$package = undef,
$package_ensure = 'present',
$lib = undef,
$lib_path = $::apache::params::lib_path,
$id = undef,
$path = undef,
$loadfile_name = undef,
$loadfiles = undef,
) {
if ! defined(Class['apache']) {
fail('You must include the apache base class before using any apache defined resources')
}
$mod = $name
#include apache #This creates duplicate resources in rspec-puppet
$mod_dir = $::apache::mod_dir
# Determine if we have special lib
$mod_libs = $::apache::params::mod_libs
$mod_lib = $mod_libs[$mod] # 2.6 compatibility hack
if $lib {
$_lib = $lib
} elsif $mod_lib {
$_lib = $mod_lib
} else {
$_lib = "mod_${mod}.so"
}
# Determine if declaration specified a path to the module
if $path {
$_path = $path
} else {
$_path = "${lib_path}/${_lib}"
}
if $id {
$_id = $id
} else {
$_id = "${mod}_module"
}
if $loadfile_name {
$_loadfile_name = $loadfile_name
} else {
$_loadfile_name = "${mod}.load"
}
# Determine if we have a package
$mod_packages = $::apache::params::mod_packages
$mod_package = $mod_packages[$mod] # 2.6 compatibility hack
if $package {
$_package = $package
} elsif $mod_package {
$_package = $mod_package
} else {
$_package = undef
}
if $_package and ! defined(Package[$_package]) {
# note: FreeBSD/ports uses apxs tool to activate modules; apxs clutters
# httpd.conf with 'LoadModule' directives; here, by proper resource
# ordering, we ensure that our version of httpd.conf is reverted after
# the module gets installed.
$package_before = $::osfamily ? {
'freebsd' => [
File[$_loadfile_name],
File["${::apache::params::conf_dir}/${::apache::params::conf_file}"]
],
default => File[$_loadfile_name],
}
# $_package may be an array
package { $_package:
ensure => $package_ensure,
require => Package['httpd'],
before => $package_before,
}
}
file { "${_loadfile_name}":
ensure => file,
path => "${mod_dir}/${_loadfile_name}",
owner => 'root',
group => $::apache::params::root_group,
mode => '0644',
content => template('apache/mod/load.erb'),
require => [
Package['httpd'],
Exec["mkdir ${mod_dir}"],
],
before => File[$mod_dir],
notify => Service['httpd'],
}
if $::osfamily == 'Debian' {
$enable_dir = $::apache::mod_enable_dir
file{ "${_loadfile_name} symlink":
ensure => link,
path => "${enable_dir}/${_loadfile_name}",
target => "${mod_dir}/${_loadfile_name}",
owner => 'root',
group => $::apache::params::root_group,
mode => '0644',
require => [
File[$_loadfile_name],
Exec["mkdir ${enable_dir}"],
],
before => File[$enable_dir],
notify => Service['httpd'],
}
# Each module may have a .conf file as well, which should be
# defined in the class apache::mod::module
# Some modules do not require this file.
if defined(File["${mod}.conf"]) {
file{ "${mod}.conf symlink":
ensure => link,
path => "${enable_dir}/${mod}.conf",
target => "${mod_dir}/${mod}.conf",
owner => 'root',
group => $::apache::params::root_group,
mode => '0644',
require => [
File["${mod}.conf"],
Exec["mkdir ${enable_dir}"],
],
before => File[$enable_dir],
notify => Service['httpd'],
}
}
}
}

View File

@@ -0,0 +1,3 @@
class apache::mod::actions {
apache::mod { 'actions': }
}

View File

@@ -0,0 +1,19 @@
class apache::mod::alias(
$apache_version = $apache::apache_version
) {
$icons_path = $::osfamily ? {
'debian' => '/usr/share/apache2/icons',
'redhat' => '/var/www/icons',
'freebsd' => '/usr/local/www/apache22/icons',
}
apache::mod { 'alias': }
# Template uses $icons_path
file { 'alias.conf':
ensure => file,
path => "${::apache::mod_dir}/alias.conf",
content => template('apache/mod/alias.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,3 @@
class apache::mod::auth_basic {
::apache::mod { 'auth_basic': }
}

View File

@@ -0,0 +1,5 @@
class apache::mod::auth_kerb {
::apache::mod { 'auth_kerb': }
}

View File

@@ -0,0 +1,19 @@
class apache::mod::authnz_ldap (
$verifyServerCert = true,
) {
include '::apache::mod::ldap'
::apache::mod { 'authnz_ldap': }
validate_bool($verifyServerCert)
# Template uses:
# - $verifyServerCert
file { 'authnz_ldap.conf':
ensure => file,
path => "${::apache::mod_dir}/authnz_ldap.conf",
content => template('apache/mod/authnz_ldap.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,12 @@
class apache::mod::autoindex {
::apache::mod { 'autoindex': }
# Template uses no variables
file { 'autoindex.conf':
ensure => file,
path => "${::apache::mod_dir}/autoindex.conf",
content => template('apache/mod/autoindex.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,3 @@
class apache::mod::cache {
::apache::mod { 'cache': }
}

View File

@@ -0,0 +1,4 @@
class apache::mod::cgi {
Class['::apache::mod::prefork'] -> Class['::apache::mod::cgi']
::apache::mod { 'cgi': }
}

View File

@@ -0,0 +1,23 @@
class apache::mod::cgid {
Class['::apache::mod::worker'] -> Class['::apache::mod::cgid']
# Debian specifies it's cgid sock path, but RedHat uses the default value
# with no config file
$cgisock_path = $::osfamily ? {
'debian' => '${APACHE_RUN_DIR}/cgisock',
'freebsd' => 'cgisock',
default => undef,
}
::apache::mod { 'cgid': }
if $cgisock_path {
# Template uses $cgisock_path
file { 'cgid.conf':
ensure => file,
path => "${::apache::mod_dir}/cgid.conf",
content => template('apache/mod/cgid.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}
}

View File

@@ -0,0 +1,3 @@
class apache::mod::dav {
::apache::mod { 'dav': }
}

View File

@@ -0,0 +1,20 @@
class apache::mod::dav_fs {
$dav_lock = $::osfamily ? {
'debian' => '${APACHE_LOCK_DIR}/DAVLock',
'freebsd' => '/usr/local/var/DavLock',
default => '/var/lib/dav/lockdb',
}
Class['::apache::mod::dav'] -> Class['::apache::mod::dav_fs']
::apache::mod { 'dav_fs': }
# Template uses: $dav_lock
file { 'dav_fs.conf':
ensure => file,
path => "${::apache::mod_dir}/dav_fs.conf",
content => template('apache/mod/dav_fs.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,14 @@
class apache::mod::dav_svn (
$authz_svn_enabled = false,
) {
Class['::apache::mod::dav'] -> Class['::apache::mod::dav_svn']
include ::apache::mod::dav
::apache::mod { 'dav_svn': }
if $authz_svn_enabled {
::apache::mod { 'authz_svn':
loadfile_name => 'dav_svn_authz_svn.load',
require => Apache::Mod['dav_svn'],
}
}
}

View File

@@ -0,0 +1,12 @@
class apache::mod::deflate {
::apache::mod { 'deflate': }
# Template uses no variables
file { 'deflate.conf':
ensure => file,
path => "${::apache::mod_dir}/deflate.conf",
content => template('apache/mod/deflate.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,5 @@
class apache::mod::dev {
# Development packages are not apache modules
warning('apache::mod::dev is deprecated; please use apache::dev')
include ::apache::dev
}

View File

@@ -0,0 +1,21 @@
# Note: this sets the global DirectoryIndex directive, it may be necessary to consider being able to modify the apache::vhost to declare DirectoryIndex statements in a vhost configuration
# Parameters:
# - $indexes provides a string for the DirectoryIndex directive http://httpd.apache.org/docs/current/mod/mod_dir.html#directoryindex
class apache::mod::dir (
$dir = 'public_html',
$indexes = ['index.html','index.html.var','index.cgi','index.pl','index.php','index.xhtml'],
) {
validate_array($indexes)
::apache::mod { 'dir': }
# Template uses
# - $indexes
file { 'dir.conf':
ensure => file,
path => "${::apache::mod_dir}/dir.conf",
content => template('apache/mod/dir.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,24 @@
class apache::mod::disk_cache {
$cache_root = $::osfamily ? {
'debian' => '/var/cache/apache2/mod_disk_cache',
'redhat' => '/var/cache/mod_proxy',
'freebsd' => '/var/cache/mod_disk_cache',
}
if $::osfamily != 'FreeBSD' {
# FIXME: investigate why disk_cache was dependent on proxy
# NOTE: on FreeBSD disk_cache is compiled by default but proxy is not
Class['::apache::mod::proxy'] -> Class['::apache::mod::disk_cache']
}
Class['::apache::mod::cache'] -> Class['::apache::mod::disk_cache']
apache::mod { 'disk_cache': }
# Template uses $cache_proxy
file { 'disk_cache.conf':
ensure => file,
path => "${::apache::mod_dir}/disk_cache.conf",
content => template('apache/mod/disk_cache.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,62 @@
class apache::mod::event (
$startservers = '2',
$maxclients = '150',
$minsparethreads = '25',
$maxsparethreads = '75',
$threadsperchild = '25',
$maxrequestsperchild = '0',
$serverlimit = '25',
$apache_version = $::apache::apache_version,
) {
if defined(Class['apache::mod::itk']) {
fail('May not include both apache::mod::event and apache::mod::itk on the same node')
}
if defined(Class['apache::mod::peruser']) {
fail('May not include both apache::mod::event and apache::mod::peruser on the same node')
}
if defined(Class['apache::mod::prefork']) {
fail('May not include both apache::mod::event and apache::mod::prefork on the same node')
}
if defined(Class['apache::mod::worker']) {
fail('May not include both apache::mod::event and apache::mod::worker on the same node')
}
File {
owner => 'root',
group => $::apache::params::root_group,
mode => '0644',
}
# Template uses:
# - $startservers
# - $maxclients
# - $minsparethreads
# - $maxsparethreads
# - $threadsperchild
# - $maxrequestsperchild
# - $serverlimit
file { "${::apache::mod_dir}/event.conf":
ensure => file,
content => template('apache/mod/event.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
case $::osfamily {
'redhat': {
if versioncmp($apache_version, '2.4') >= 0 {
apache::mpm{ 'event':
apache_version => $apache_version,
}
}
}
'debian','freebsd' : {
apache::mpm{ 'event':
apache_version => $apache_version,
}
}
default: {
fail("Unsupported osfamily ${::osfamily}")
}
}
}

View File

@@ -0,0 +1,3 @@
class apache::mod::expires {
::apache::mod { 'expires': }
}

View File

@@ -0,0 +1,24 @@
class apache::mod::fastcgi {
# Debian specifies it's fastcgi lib path, but RedHat uses the default value
# with no config file
$fastcgi_lib_path = $::apache::params::fastcgi_lib_path
::apache::mod { 'fastcgi': }
if $fastcgi_lib_path {
# Template uses:
# - $fastcgi_server
# - $fastcgi_socket
# - $fastcgi_dir
file { 'fastcgi.conf':
ensure => file,
path => "${::apache::mod_dir}/fastcgi.conf",
content => template('apache/mod/fastcgi.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}
}

View File

@@ -0,0 +1,16 @@
class apache::mod::fcgid(
$options = {},
) {
::apache::mod { 'fcgid': }
# Template uses:
# - $options
file { 'fcgid.conf':
ensure => file,
path => "${::apache::mod_dir}/fcgid.conf",
content => template('apache/mod/fcgid.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,3 @@
class apache::mod::headers {
::apache::mod { 'headers': }
}

View File

@@ -0,0 +1,3 @@
class apache::mod::include {
::apache::mod { 'include': }
}

View File

@@ -0,0 +1,17 @@
class apache::mod::info (
$allow_from = ['127.0.0.1','::1'],
$apache_version = $::apache::apache_version,
){
apache::mod { 'info': }
# Template uses
# $allow_from
# $apache_version
file { 'info.conf':
ensure => file,
path => "${::apache::mod_dir}/info.conf",
content => template('apache/mod/info.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,53 @@
class apache::mod::itk (
$startservers = '8',
$minspareservers = '5',
$maxspareservers = '20',
$serverlimit = '256',
$maxclients = '256',
$maxrequestsperchild = '4000',
$apache_version = $::apache::apache_version,
) {
if defined(Class['apache::mod::event']) {
fail('May not include both apache::mod::itk and apache::mod::event on the same node')
}
if defined(Class['apache::mod::peruser']) {
fail('May not include both apache::mod::itk and apache::mod::peruser on the same node')
}
if defined(Class['apache::mod::prefork']) {
fail('May not include both apache::mod::itk and apache::mod::prefork on the same node')
}
if defined(Class['apache::mod::worker']) {
fail('May not include both apache::mod::itk and apache::mod::worker on the same node')
}
File {
owner => 'root',
group => $::apache::params::root_group,
mode => '0644',
}
# Template uses:
# - $startservers
# - $minspareservers
# - $maxspareservers
# - $serverlimit
# - $maxclients
# - $maxrequestsperchild
file { "${::apache::mod_dir}/itk.conf":
ensure => file,
content => template('apache/mod/itk.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
case $::osfamily {
'debian', 'freebsd': {
apache::mpm{ 'itk':
apache_version => $apache_version,
}
}
default: {
fail("Unsupported osfamily ${::osfamily}")
}
}
}

View File

@@ -0,0 +1,14 @@
class apache::mod::ldap (
$apache_version = $::apache::apache_version,
){
::apache::mod { 'ldap': }
# Template uses $apache_version
file { 'ldap.conf':
ensure => file,
path => "${::apache::mod_dir}/ldap.conf",
content => template('apache/mod/ldap.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,21 @@
class apache::mod::mime (
$mime_support_package = $::apache::params::mime_support_package,
$mime_types_config = $::apache::params::mime_types_config,
) {
apache::mod { 'mime': }
# Template uses $mime_types_config
file { 'mime.conf':
ensure => file,
path => "${::apache::mod_dir}/mime.conf",
content => template('apache/mod/mime.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
if $mime_support_package {
package { $mime_support_package:
ensure => 'installed',
before => File['mime.conf'],
}
}
}

View File

@@ -0,0 +1,14 @@
class apache::mod::mime_magic (
$magic_file = "${::apache::params::conf_dir}/magic"
) {
apache::mod { 'mime_magic': }
# Template uses $magic_file
file { 'mime_magic.conf':
ensure => file,
path => "${::apache::mod_dir}/mime_magic.conf",
content => template('apache/mod/mime_magic.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,12 @@
class apache::mod::negotiation {
::apache::mod { 'negotiation': }
# Template uses no variables
file { 'negotiation.conf':
ensure => file,
path => "${::apache::mod_dir}/negotiation.conf",
content => template('apache/mod/negotiation.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,25 @@
class apache::mod::nss (
$transfer_log = "${::apache::params::logroot}/access.log",
$error_log = "${::apache::params::logroot}/error.log",
$passwd_file = undef
) {
include ::apache::mod::mime
apache::mod { 'nss': }
$httpd_dir = $::apache::httpd_dir
# Template uses:
# $transfer_log
# $error_log
# $http_dir
# passwd_file
file { 'nss.conf':
ensure => file,
path => "${::apache::mod_dir}/nss.conf",
content => template('apache/mod/nss.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,55 @@
class apache::mod::pagespeed (
$inherit_vhost_config = 'on',
$filter_xhtml = false,
$cache_path = '/var/cache/mod_pagespeed/',
$log_dir = '/var/log/pagespeed',
$memache_servers = [],
$rewrite_level = 'CoreFilters',
$disable_filters = [],
$enable_filters = [],
$forbid_filters = [],
$rewrite_deadline_per_flush_ms = 10,
$additional_domains = undef,
$file_cache_size_kb = 102400,
$file_cache_clean_interval_ms = 3600000,
$lru_cache_per_process = 1024,
$lru_cache_byte_limit = 16384,
$css_flatten_max_bytes = 2048,
$css_inline_max_bytes = 2048,
$css_image_inline_max_bytes = 2048,
$image_inline_max_bytes = 2048,
$js_inline_max_bytes = 2048,
$css_outline_min_bytes = 3000,
$js_outline_min_bytes = 3000,
$inode_limit = 500000,
$image_max_rewrites_at_once = 8,
$num_rewrite_threads = 4,
$num_expensive_rewrite_threads = 4,
$collect_statistics = 'on',
$statistics_logging = 'on',
$allow_view_stats = [],
$allow_pagespeed_console = [],
$allow_pagespeed_message = [],
$message_buffer_size = 100000,
$additional_configuration = {},
$apache_version = $::apache::apache_version,
){
$_lib = $::apache::apache_version ? {
'2.4' => 'mod_pagespeed_ap24.so',
default => undef
}
apache::mod { 'pagespeed':
lib => $_lib,
}
file { 'pagespeed.conf':
ensure => file,
path => "${::apache::mod_dir}/pagespeed.conf",
content => template('apache/mod/pagespeed.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,86 @@
class apache::mod::passenger (
$passenger_conf_file = $::apache::params::passenger_conf_file,
$passenger_conf_package_file = $::apache::params::passenger_conf_package_file,
$passenger_high_performance = undef,
$passenger_pool_idle_time = undef,
$passenger_max_requests = undef,
$passenger_stat_throttle_rate = undef,
$rack_autodetect = undef,
$rails_autodetect = undef,
$passenger_root = $::apache::params::passenger_root,
$passenger_ruby = $::apache::params::passenger_ruby,
$passenger_default_ruby = $::apache::params::passenger_default_ruby,
$passenger_max_pool_size = undef,
$passenger_use_global_queue = undef,
$mod_package = undef,
$mod_package_ensure = undef,
$mod_lib = undef,
$mod_lib_path = undef,
$mod_id = undef,
$mod_path = undef,
) {
# Managed by the package, but declare it to avoid purging
if $passenger_conf_package_file {
file { 'passenger_package.conf':
path => "${::apache::mod_dir}/${passenger_conf_package_file}",
}
} else {
# Remove passenger_extra.conf left over from before Passenger support was
# reworked for Debian. This is a temporary fix for users running this
# module from master after release 1.0.1 It will be removed in two
# releases from now.
$passenger_package_conf_ensure = $::osfamily ? {
'Debian' => 'absent',
default => undef,
}
file { 'passenger_package.conf':
ensure => $passenger_package_conf_ensure,
path => "${::apache::mod_dir}/passenger_extra.conf",
}
}
$_package = $mod_package
$_package_ensure = $mod_package_ensure
$_lib = $mod_lib
if $::osfamily == 'FreeBSD' {
if $mod_lib_path {
$_lib_path = $mod_lib_path
} else {
$_lib_path = "${passenger_root}/buildout/apache2"
}
} else {
$_lib_path = $mod_lib_path
}
$_id = $mod_id
$_path = $mod_path
::apache::mod { 'passenger':
package => $_package,
package_ensure => $_package_ensure,
lib => $_lib,
lib_path => $_lib_path,
id => $_id,
path => $_path,
}
# Template uses:
# - $passenger_root
# - $passenger_ruby
# - $passenger_default_ruby
# - $passenger_max_pool_size
# - $passenger_high_performance
# - $passenger_max_requests
# - $passenger_stat_throttle_rate
# - $passenger_use_global_queue
# - $rack_autodetect
# - $rails_autodetect
file { 'passenger.conf':
ensure => file,
path => "${::apache::mod_dir}/${passenger_conf_file}",
content => template('apache/mod/passenger.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,3 @@
class apache::mod::perl {
::apache::mod { 'perl': }
}

View File

@@ -0,0 +1,73 @@
class apache::mod::peruser (
$minspareprocessors = '2',
$minprocessors = '2',
$maxprocessors = '10',
$maxclients = '150',
$maxrequestsperchild = '1000',
$idletimeout = '120',
$expiretimeout = '120',
$keepalive = 'Off',
) {
if defined(Class['apache::mod::event']) {
fail('May not include both apache::mod::peruser and apache::mod::event on the same node')
}
if defined(Class['apache::mod::itk']) {
fail('May not include both apache::mod::peruser and apache::mod::itk on the same node')
}
if defined(Class['apache::mod::prefork']) {
fail('May not include both apache::mod::peruser and apache::mod::prefork on the same node')
}
if defined(Class['apache::mod::worker']) {
fail('May not include both apache::mod::peruser and apache::mod::worker on the same node')
}
File {
owner => 'root',
group => $::apache::params::root_group,
mode => '0644',
}
$mod_dir = $::apache::mod_dir
# Template uses:
# - $minspareprocessors
# - $minprocessors
# - $maxprocessors
# - $maxclients
# - $maxrequestsperchild
# - $idletimeout
# - $expiretimeout
# - $keepalive
# - $mod_dir
file { "${::apache::mod_dir}/peruser.conf":
ensure => file,
content => template('apache/mod/peruser.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
file { "${::apache::mod_dir}/peruser":
ensure => directory,
require => File[$::apache::mod_dir],
}
file { "${::apache::mod_dir}/peruser/multiplexers":
ensure => directory,
require => File["${::apache::mod_dir}/peruser"],
}
file { "${::apache::mod_dir}/peruser/processors":
ensure => directory,
require => File["${::apache::mod_dir}/peruser"],
}
::apache::peruser::multiplexer { '01-default': }
case $::osfamily {
'freebsd' : {
class { '::apache::package':
mpm_module => 'peruser'
}
}
default: {
fail("Unsupported osfamily ${::osfamily}")
}
}
}

View File

@@ -0,0 +1,55 @@
class apache::mod::php (
$package_name = undef,
$package_ensure = 'present',
$path = undef,
$extensions = ['.php'],
$content = undef,
$template = 'apache/mod/php5.conf.erb',
$source = undef,
) {
if ! defined(Class['apache::mod::prefork']) {
fail('apache::mod::php requires apache::mod::prefork; please enable mpm_module => \'prefork\' on Class[\'apache\']')
}
validate_array($extensions)
if $source and ($content or $template != 'apache/mod/php5.conf.erb') {
warning('source and content or template parameters are provided. source parameter will be used')
} elsif $content and $template != 'apache/mod/php5.conf.erb' {
warning('content and template parameters are provided. content parameter will be used')
}
$manage_content = $source ? {
undef => $content ? {
undef => template($template),
default => $content,
},
default => undef,
}
::apache::mod { 'php5':
package => $package_name,
package_ensure => $package_ensure,
path => $path,
}
include ::apache::mod::mime
include ::apache::mod::dir
Class['::apache::mod::mime'] -> Class['::apache::mod::dir'] -> Class['::apache::mod::php']
# Template uses $extensions
file { 'php5.conf':
ensure => file,
path => "${::apache::mod_dir}/php5.conf",
owner => 'root',
group => 'root',
mode => '0644',
content => $manage_content,
source => $source,
require => [
Class['::apache::mod::prefork'],
Exec["mkdir ${::apache::mod_dir}"],
],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,70 @@
class apache::mod::prefork (
$startservers = '8',
$minspareservers = '5',
$maxspareservers = '20',
$serverlimit = '256',
$maxclients = '256',
$maxrequestsperchild = '4000',
$apache_version = $::apache::apache_version,
) {
if defined(Class['apache::mod::event']) {
fail('May not include both apache::mod::prefork and apache::mod::event on the same node')
}
if defined(Class['apache::mod::itk']) {
fail('May not include both apache::mod::prefork and apache::mod::itk on the same node')
}
if defined(Class['apache::mod::peruser']) {
fail('May not include both apache::mod::prefork and apache::mod::peruser on the same node')
}
if defined(Class['apache::mod::worker']) {
fail('May not include both apache::mod::prefork and apache::mod::worker on the same node')
}
File {
owner => 'root',
group => $::apache::params::root_group,
mode => '0644',
}
# Template uses:
# - $startservers
# - $minspareservers
# - $maxspareservers
# - $serverlimit
# - $maxclients
# - $maxrequestsperchild
file { "${::apache::mod_dir}/prefork.conf":
ensure => file,
content => template('apache/mod/prefork.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
case $::osfamily {
'redhat': {
if versioncmp($apache_version, '2.4') >= 0 {
::apache::mpm{ 'prefork':
apache_version => $apache_version,
}
}
else {
file_line { '/etc/sysconfig/httpd prefork enable':
ensure => present,
path => '/etc/sysconfig/httpd',
line => '#HTTPD=/usr/sbin/httpd.worker',
match => '#?HTTPD=/usr/sbin/httpd.worker',
require => Package['httpd'],
notify => Service['httpd'],
}
}
}
'debian', 'freebsd' : {
::apache::mpm{ 'prefork':
apache_version => $apache_version,
}
}
default: {
fail("Unsupported osfamily ${::osfamily}")
}
}
}

View File

@@ -0,0 +1,16 @@
class apache::mod::proxy (
$proxy_requests = 'Off',
$allow_from = undef,
$apache_version = $::apache::apache_version,
) {
::apache::mod { 'proxy': }
# Template uses $proxy_requests, $apache_version
file { 'proxy.conf':
ensure => file,
path => "${::apache::mod_dir}/proxy.conf",
content => template('apache/mod/proxy.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,4 @@
class apache::mod::proxy_ajp {
Class['::apache::mod::proxy'] -> Class['::apache::mod::proxy_ajp']
::apache::mod { 'proxy_ajp': }
}

View File

@@ -0,0 +1,10 @@
class apache::mod::proxy_balancer {
include ::apache::mod::proxy
include ::apache::mod::proxy_http
Class['::apache::mod::proxy'] -> Class['::apache::mod::proxy_balancer']
Class['::apache::mod::proxy_http'] -> Class['::apache::mod::proxy_balancer']
::apache::mod { 'proxy_balancer': }
}

View File

@@ -0,0 +1,37 @@
class apache::mod::proxy_html {
Class['::apache::mod::proxy'] -> Class['::apache::mod::proxy_html']
Class['::apache::mod::proxy_http'] -> Class['::apache::mod::proxy_html']
# Add libxml2
case $::osfamily {
/RedHat|FreeBSD/: {
::apache::mod { 'xml2enc': }
$loadfiles = undef
}
'Debian': {
$gnu_path = $::hardwaremodel ? {
'i686' => 'i386',
default => $::hardwaremodel,
}
$loadfiles = $::apache::params::distrelease ? {
'6' => ['/usr/lib/libxml2.so.2'],
'10' => ['/usr/lib/libxml2.so.2'],
default => ["/usr/lib/${gnu_path}-linux-gnu/libxml2.so.2"],
}
}
}
::apache::mod { 'proxy_html':
loadfiles => $loadfiles,
}
# Template uses $icons_path
file { 'proxy_html.conf':
ensure => file,
path => "${::apache::mod_dir}/proxy_html.conf",
content => template('apache/mod/proxy_html.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,4 @@
class apache::mod::proxy_http {
Class['::apache::mod::proxy'] -> Class['::apache::mod::proxy_http']
::apache::mod { 'proxy_http': }
}

View File

@@ -0,0 +1,5 @@
class apache::mod::python {
::apache::mod { 'python': }
}

View File

@@ -0,0 +1,12 @@
class apache::mod::reqtimeout {
::apache::mod { 'reqtimeout': }
# Template uses no variables
file { 'reqtimeout.conf':
ensure => file,
path => "${::apache::mod_dir}/reqtimeout.conf",
content => template('apache/mod/reqtimeout.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,4 @@
class apache::mod::rewrite {
include ::apache::params
::apache::mod { 'rewrite': }
}

View File

@@ -0,0 +1,20 @@
class apache::mod::rpaf (
$sethostname = true,
$proxy_ips = [ '127.0.0.1' ],
$header = 'X-Forwarded-For'
) {
::apache::mod { 'rpaf': }
# Template uses:
# - $sethostname
# - $proxy_ips
# - $header
file { 'rpaf.conf':
ensure => file,
path => "${::apache::mod_dir}/rpaf.conf",
content => template('apache/mod/rpaf.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,12 @@
class apache::mod::setenvif {
::apache::mod { 'setenvif': }
# Template uses no variables
file { 'setenvif.conf':
ensure => file,
path => "${::apache::mod_dir}/setenvif.conf",
content => template('apache/mod/setenvif.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,3 @@
class apache::mod::speling {
::apache::mod { 'speling': }
}

View File

@@ -0,0 +1,56 @@
class apache::mod::ssl (
$ssl_compression = false,
$ssl_options = [ 'StdEnvVars' ],
$ssl_cipher = 'HIGH:MEDIUM:!aNULL:!MD5',
$apache_version = $::apache::apache_version,
) {
$session_cache = $::osfamily ? {
'debian' => '${APACHE_RUN_DIR}/ssl_scache(512000)',
'redhat' => '/var/cache/mod_ssl/scache(512000)',
'freebsd' => '/var/run/ssl_scache(512000)',
}
case $::osfamily {
'debian': {
if versioncmp($apache_version, '2.4') >= 0 and $::operatingsystem == 'Ubuntu' {
$ssl_mutex = 'default'
} elsif $::operatingsystem == 'Ubuntu' and $::operatingsystemrelease == '10.04' {
$ssl_mutex = 'file:/var/run/apache2/ssl_mutex'
} else {
$ssl_mutex = 'file:${APACHE_RUN_DIR}/ssl_mutex'
}
}
'redhat': {
$ssl_mutex = 'default'
}
'freebsd': {
$ssl_mutex = 'default'
}
default: {
fail("Unsupported osfamily ${::osfamily}")
}
}
::apache::mod { 'ssl': }
if versioncmp($apache_version, '2.4') >= 0 {
::apache::mod { 'socache_shmcb': }
}
# Template uses
#
# $ssl_compression
# $ssl_options
# $session_cache,
# $ssl_mutex
# $apache_version
#
file { 'ssl.conf':
ensure => file,
path => "${::apache::mod_dir}/ssl.conf",
content => template('apache/mod/ssl.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,43 @@
# Class: apache::mod::status
#
# This class enables and configures Apache mod_status
# See: http://httpd.apache.org/docs/current/mod/mod_status.html
#
# Parameters:
# - $allow_from is an array of hosts, ip addresses, partial network numbers
# or networks in CIDR notation specifying what hosts can view the special
# /server-status URL. Defaults to ['127.0.0.1', '::1'].
# - $extended_status track and display extended status information. Valid
# values are 'On' or 'Off'. Defaults to 'On'.
#
# Actions:
# - Enable and configure Apache mod_status
#
# Requires:
# - The apache class
#
# Sample Usage:
#
# # Simple usage allowing access from localhost and a private subnet
# class { 'apache::mod::status':
# $allow_from => ['127.0.0.1', '10.10.10.10/24'],
# }
#
class apache::mod::status (
$allow_from = ['127.0.0.1','::1'],
$extended_status = 'On',
$apache_version = $::apache::apache_version,
){
validate_array($allow_from)
validate_re(downcase($extended_status), '^(on|off)$', "${extended_status} is not supported for extended_status. Allowed values are 'On' and 'Off'.")
::apache::mod { 'status': }
# Template uses $allow_from, $extended_status, $apache_version
file { 'status.conf':
ensure => file,
path => "${::apache::mod_dir}/status.conf",
content => template('apache/mod/status.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,3 @@
class apache::mod::suexec {
::apache::mod { 'suexec': }
}

View File

@@ -0,0 +1,14 @@
class apache::mod::suphp (
){
::apache::mod { 'suphp': }
file {'suphp.conf':
ensure => file,
path => "${::apache::mod_dir}/suphp.conf",
content => template('apache/mod/suphp.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd']
}
}

View File

@@ -0,0 +1,18 @@
class apache::mod::userdir (
$home = '/home',
$dir = 'public_html',
$disable_root = true,
$apache_version = $::apache::apache_version,
) {
::apache::mod { 'userdir': }
# Template uses $home, $dir, $disable_root, $apache_version
file { 'userdir.conf':
ensure => file,
path => "${::apache::mod_dir}/userdir.conf",
content => template('apache/mod/userdir.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,3 @@
class apache::mod::vhost_alias {
::apache::mod { 'vhost_alias': }
}

View File

@@ -0,0 +1,74 @@
class apache::mod::worker (
$startservers = '2',
$maxclients = '150',
$minsparethreads = '25',
$maxsparethreads = '75',
$threadsperchild = '25',
$maxrequestsperchild = '0',
$serverlimit = '25',
$threadlimit = '64',
$apache_version = $::apache::apache_version,
) {
if defined(Class['apache::mod::event']) {
fail('May not include both apache::mod::worker and apache::mod::event on the same node')
}
if defined(Class['apache::mod::itk']) {
fail('May not include both apache::mod::worker and apache::mod::itk on the same node')
}
if defined(Class['apache::mod::peruser']) {
fail('May not include both apache::mod::worker and apache::mod::peruser on the same node')
}
if defined(Class['apache::mod::prefork']) {
fail('May not include both apache::mod::worker and apache::mod::prefork on the same node')
}
File {
owner => 'root',
group => $::apache::params::root_group,
mode => '0644',
}
# Template uses:
# - $startservers
# - $maxclients
# - $minsparethreads
# - $maxsparethreads
# - $threadsperchild
# - $maxrequestsperchild
# - $serverlimit
# - $threadLimit
file { "${::apache::mod_dir}/worker.conf":
ensure => file,
content => template('apache/mod/worker.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd'],
}
case $::osfamily {
'redhat': {
if versioncmp($apache_version, '2.4') >= 0 {
::apache::mpm{ 'worker':
apache_version => $apache_version,
}
}
else {
file_line { '/etc/sysconfig/httpd worker enable':
ensure => present,
path => '/etc/sysconfig/httpd',
line => 'HTTPD=/usr/sbin/httpd.worker',
match => '#?HTTPD=/usr/sbin/httpd.worker',
require => Package['httpd'],
notify => Service['httpd'],
}
}
}
'debian', 'freebsd': {
::apache::mpm{ 'worker':
apache_version => $apache_version,
}
}
default: {
fail("Unsupported osfamily ${::osfamily}")
}
}
}

View File

@@ -0,0 +1,21 @@
class apache::mod::wsgi (
$wsgi_socket_prefix = undef,
$wsgi_python_path = undef,
$wsgi_python_home = undef,
){
::apache::mod { 'wsgi': }
# Template uses:
# - $wsgi_socket_prefix
# - $wsgi_python_path
# - $wsgi_python_home
file {'wsgi.conf':
ensure => file,
path => "${::apache::mod_dir}/wsgi.conf",
content => template('apache/mod/wsgi.conf.erb'),
require => Exec["mkdir ${::apache::mod_dir}"],
before => File[$::apache::mod_dir],
notify => Service['httpd']
}
}

View File

@@ -0,0 +1,4 @@
class apache::mod::xsendfile {
include ::apache::params
::apache::mod { 'xsendfile': }
}

View File

@@ -0,0 +1,68 @@
define apache::mpm (
$lib_path = $::apache::params::lib_path,
$apache_version = $::apache::apache_version,
) {
if ! defined(Class['apache']) {
fail('You must include the apache base class before using any apache defined resources')
}
$mpm = $name
$mod_dir = $::apache::mod_dir
$_lib = "mod_mpm_${mpm}.so"
$_path = "${lib_path}/${_lib}"
$_id = "mpm_${mpm}_module"
if versioncmp($apache_version, '2.4') >= 0 {
file { "${mod_dir}/${mpm}.load":
ensure => file,
path => "${mod_dir}/${mpm}.load",
content => "LoadModule ${_id} ${_path}\n",
require => [
Package['httpd'],
Exec["mkdir ${mod_dir}"],
],
before => File[$mod_dir],
notify => Service['httpd'],
}
}
case $::osfamily {
'debian': {
file { "${::apache::mod_enable_dir}/${mpm}.conf":
ensure => link,
target => "${::apache::mod_dir}/${mpm}.conf",
require => Exec["mkdir ${::apache::mod_enable_dir}"],
before => File[$::apache::mod_enable_dir],
notify => Service['httpd'],
}
if versioncmp($apache_version, '2.4') >= 0 {
file { "${::apache::mod_enable_dir}/${mpm}.load":
ensure => link,
target => "${::apache::mod_dir}/${mpm}.load",
require => Exec["mkdir ${::apache::mod_enable_dir}"],
before => File[$::apache::mod_enable_dir],
notify => Service['httpd'],
}
}
if versioncmp($apache_version, '2.4') < 0 {
package { "apache2-mpm-${mpm}":
ensure => present,
}
}
}
'freebsd': {
class { '::apache::package':
mpm_module => $mpm
}
}
'redhat': {
# so we don't fail
}
default: {
fail("Unsupported osfamily ${::osfamily}")
}
}
}

View File

@@ -0,0 +1,10 @@
define apache::namevirtualhost {
$addr_port = $name
# Template uses: $addr_port
concat::fragment { "NameVirtualHost ${addr_port}":
ensure => present,
target => $::apache::ports_file,
content => template('apache/namevirtualhost.erb'),
}
}

View File

@@ -0,0 +1,48 @@
class apache::package (
$ensure = 'present',
$mpm_module = $::apache::params::mpm_module,
) inherits ::apache::params {
case $::osfamily {
'freebsd' : {
$all_mpms = [
'www/apache22',
'www/apache22-worker-mpm',
'www/apache22-event-mpm',
'www/apache22-itk-mpm',
'www/apache22-peruser-mpm',
]
if $mpm_module {
$apache_package = $mpm_module ? {
'prefork' => 'www/apache22',
default => "www/apache22-${mpm_module}-mpm"
}
} else {
$apache_package = 'www/apache22'
}
$other_mpms = delete($all_mpms, $apache_package)
# Configure ports to have apache module packages dependent on correct
# version of apache package (apache22, apache22-worker-mpm, ...)
file_line { 'APACHE_PORT in /etc/make.conf':
ensure => $ensure,
path => '/etc/make.conf',
line => "APACHE_PORT=${apache_package}",
match => '^\s*#?\s*APACHE_PORT\s*=\s*',
before => Package['httpd'],
}
# remove other packages
ensure_resource('package', $other_mpms, {
ensure => absent,
before => Package['httpd'],
require => File_line['APACHE_PORT in /etc/make.conf'],
})
}
default: {
$apache_package = $::apache::params::apache_name
}
}
package { 'httpd':
ensure => $ensure,
name => $apache_package,
notify => Class['Apache::Service'],
}
}

View File

@@ -0,0 +1,258 @@
# Class: apache::params
#
# This class manages Apache parameters
#
# Parameters:
# - The $user that Apache runs as
# - The $group that Apache runs as
# - The $apache_name is the name of the package and service on the relevant
# distribution
# - The $php_package is the name of the package that provided PHP
# - The $ssl_package is the name of the Apache SSL package
# - The $apache_dev is the name of the Apache development libraries package
# - The $conf_contents is the contents of the Apache configuration file
#
# Actions:
#
# Requires:
#
# Sample Usage:
#
class apache::params inherits ::apache::version {
if($::fqdn) {
$servername = $::fqdn
} else {
$servername = $::hostname
}
# The default error log level
$log_level = 'warn'
if $::osfamily == 'RedHat' or $::operatingsystem == 'amazon' {
$user = 'apache'
$group = 'apache'
$root_group = 'root'
$apache_name = 'httpd'
$service_name = 'httpd'
$httpd_dir = '/etc/httpd'
$server_root = '/etc/httpd'
$conf_dir = "${httpd_dir}/conf"
$confd_dir = "${httpd_dir}/conf.d"
$mod_dir = "${httpd_dir}/conf.d"
$mod_enable_dir = undef
$vhost_dir = "${httpd_dir}/conf.d"
$vhost_enable_dir = undef
$conf_file = 'httpd.conf'
$ports_file = "${conf_dir}/ports.conf"
$logroot = '/var/log/httpd'
$lib_path = 'modules'
$mpm_module = 'prefork'
$dev_packages = 'httpd-devel'
$default_ssl_cert = '/etc/pki/tls/certs/localhost.crt'
$default_ssl_key = '/etc/pki/tls/private/localhost.key'
$ssl_certs_dir = '/etc/pki/tls/certs'
$passenger_conf_file = 'passenger_extra.conf'
$passenger_conf_package_file = 'passenger.conf'
$passenger_root = undef
$passenger_ruby = undef
$passenger_default_ruby = undef
$suphp_addhandler = 'php5-script'
$suphp_engine = 'off'
$suphp_configpath = undef
$mod_packages = {
'auth_kerb' => 'mod_auth_kerb',
'authnz_ldap' => 'mod_authz_ldap',
'fastcgi' => 'mod_fastcgi',
'fcgid' => 'mod_fcgid',
'pagespeed' => 'mod-pagespeed-stable',
'passenger' => 'mod_passenger',
'perl' => 'mod_perl',
'php5' => $::apache::version::distrelease ? {
'5' => 'php53',
default => 'php',
},
'proxy_html' => 'mod_proxy_html',
'python' => 'mod_python',
'shibboleth' => 'shibboleth',
'ssl' => 'mod_ssl',
'wsgi' => 'mod_wsgi',
'dav_svn' => 'mod_dav_svn',
'suphp' => 'mod_suphp',
'xsendfile' => 'mod_xsendfile',
'nss' => 'mod_nss',
}
$mod_libs = {
'php5' => 'libphp5.so',
'nss' => 'libmodnss.so',
}
$conf_template = 'apache/httpd.conf.erb'
$keepalive = 'Off'
$keepalive_timeout = 15
$max_keepalive_requests = 100
$fastcgi_lib_path = undef
$mime_support_package = 'mailcap'
$mime_types_config = '/etc/mime.types'
} elsif $::osfamily == 'Debian' {
$user = 'www-data'
$group = 'www-data'
$root_group = 'root'
$apache_name = 'apache2'
$service_name = 'apache2'
$httpd_dir = '/etc/apache2'
$server_root = '/etc/apache2'
$conf_dir = $httpd_dir
$confd_dir = "${httpd_dir}/conf.d"
$mod_dir = "${httpd_dir}/mods-available"
$mod_enable_dir = "${httpd_dir}/mods-enabled"
$vhost_dir = "${httpd_dir}/sites-available"
$vhost_enable_dir = "${httpd_dir}/sites-enabled"
$conf_file = 'apache2.conf'
$ports_file = "${conf_dir}/ports.conf"
$logroot = '/var/log/apache2'
$lib_path = '/usr/lib/apache2/modules'
$mpm_module = 'worker'
$dev_packages = ['libaprutil1-dev', 'libapr1-dev', 'apache2-prefork-dev']
$default_ssl_cert = '/etc/ssl/certs/ssl-cert-snakeoil.pem'
$default_ssl_key = '/etc/ssl/private/ssl-cert-snakeoil.key'
$ssl_certs_dir = '/etc/ssl/certs'
$suphp_addhandler = 'x-httpd-php'
$suphp_engine = 'off'
$suphp_configpath = '/etc/php5/apache2'
$mod_packages = {
'auth_kerb' => 'libapache2-mod-auth-kerb',
'dav_svn' => 'libapache2-svn',
'fastcgi' => 'libapache2-mod-fastcgi',
'fcgid' => 'libapache2-mod-fcgid',
'nss' => 'libapache2-mod-nss',
'pagespeed' => 'mod-pagespeed-stable',
'passenger' => 'libapache2-mod-passenger',
'perl' => 'libapache2-mod-perl2',
'php5' => 'libapache2-mod-php5',
'proxy_html' => 'libapache2-mod-proxy-html',
'python' => 'libapache2-mod-python',
'rpaf' => 'libapache2-mod-rpaf',
'suphp' => 'libapache2-mod-suphp',
'wsgi' => 'libapache2-mod-wsgi',
'xsendfile' => 'libapache2-mod-xsendfile',
}
$mod_libs = {
'php5' => 'libphp5.so',
}
$conf_template = 'apache/httpd.conf.erb'
$keepalive = 'Off'
$keepalive_timeout = 15
$max_keepalive_requests = 100
$fastcgi_lib_path = '/var/lib/apache2/fastcgi'
$mime_support_package = 'mime-support'
$mime_types_config = '/etc/mime.types'
#
# Passenger-specific settings
#
$passenger_conf_file = 'passenger.conf'
$passenger_conf_package_file = undef
case $::operatingsystem {
'Ubuntu': {
case $::lsbdistrelease {
'12.04': {
$passenger_root = '/usr'
$passenger_ruby = '/usr/bin/ruby'
$passenger_default_ruby = undef
}
'14.04': {
$passenger_root = '/usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini'
$passenger_ruby = undef
$passenger_default_ruby = '/usr/bin/ruby'
}
default: {
# The following settings may or may not work on Ubuntu releases not
# supported by this module.
$passenger_root = '/usr'
$passenger_ruby = '/usr/bin/ruby'
$passenger_default_ruby = undef
}
}
}
'Debian': {
case $::lsbdistcodename {
'wheezy': {
$passenger_root = '/usr'
$passenger_ruby = '/usr/bin/ruby'
$passenger_default_ruby = undef
}
default: {
# The following settings may or may not work on Debian releases not
# supported by this module.
$passenger_root = '/usr'
$passenger_ruby = '/usr/bin/ruby'
$passenger_default_ruby = undef
}
}
}
}
} elsif $::osfamily == 'FreeBSD' {
$user = 'www'
$group = 'www'
$root_group = 'wheel'
$apache_name = 'apache22'
$service_name = 'apache22'
$httpd_dir = '/usr/local/etc/apache22'
$server_root = '/usr/local'
$conf_dir = $httpd_dir
$confd_dir = "${httpd_dir}/Includes"
$mod_dir = "${httpd_dir}/Modules"
$mod_enable_dir = undef
$vhost_dir = "${httpd_dir}/Vhosts"
$vhost_enable_dir = undef
$conf_file = 'httpd.conf'
$ports_file = "${conf_dir}/ports.conf"
$logroot = '/var/log/apache22'
$lib_path = '/usr/local/libexec/apache22'
$mpm_module = 'prefork'
$dev_packages = undef
$default_ssl_cert = '/usr/local/etc/apache22/server.crt'
$default_ssl_key = '/usr/local/etc/apache22/server.key'
$ssl_certs_dir = '/usr/local/etc/apache22'
$passenger_conf_file = 'passenger.conf'
$passenger_conf_package_file = undef
$passenger_root = '/usr/local/lib/ruby/gems/1.9/gems/passenger-4.0.10'
$passenger_ruby = '/usr/bin/ruby'
$passenger_default_ruby = undef
$suphp_addhandler = 'php5-script'
$suphp_engine = 'off'
$suphp_configpath = undef
$mod_packages = {
# NOTE: I list here only modules that are not included in www/apache22
# NOTE: 'passenger' needs to enable APACHE_SUPPORT in make config
# NOTE: 'php' needs to enable APACHE option in make config
# NOTE: 'dav_svn' needs to enable MOD_DAV_SVN make config
# NOTE: not sure where the shibboleth should come from
# NOTE: don't know where the shibboleth module should come from
'auth_kerb' => 'www/mod_auth_kerb2',
'fcgid' => 'www/mod_fcgid',
'passenger' => 'www/rubygem-passenger',
'perl' => 'www/mod_perl2',
'php5' => 'lang/php5',
'proxy_html' => 'www/mod_proxy_html',
'python' => 'www/mod_python3',
'wsgi' => 'www/mod_wsgi',
'dav_svn' => 'devel/subversion',
'xsendfile' => 'www/mod_xsendfile',
'rpaf' => 'www/mod_rpaf2'
}
$mod_libs = {
'php5' => 'libphp5.so',
}
$conf_template = 'apache/httpd.conf.erb'
$keepalive = 'Off'
$keepalive_timeout = 15
$max_keepalive_requests = 100
$fastcgi_lib_path = undef # TODO: revisit
$mime_support_package = 'misc/mime-support'
$mime_types_config = '/usr/local/etc/mime.types'
} else {
fail("Class['apache::params']: Unsupported osfamily: ${::osfamily}")
}
}

View File

@@ -0,0 +1,17 @@
define apache::peruser::multiplexer (
$user = $::apache::user,
$group = $::apache::group,
$file = undef,
) {
if ! $file {
$filename = "${name}.conf"
} else {
$filename = $file
}
file { "${::apache::mod_dir}/peruser/multiplexers/${filename}":
ensure => file,
content => "Multiplexer ${user} ${group}\n",
require => File["${::apache::mod_dir}/peruser/multiplexers"],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,17 @@
define apache::peruser::processor (
$user,
$group,
$file = undef,
) {
if ! $file {
$filename = "${name}.conf"
} else {
$filename = $file
}
file { "${::apache::mod_dir}/peruser/processors/${filename}":
ensure => file,
content => "Processor ${user} ${group}\n",
require => File["${::apache::mod_dir}/peruser/processors"],
notify => Service['httpd'],
}
}

View File

@@ -0,0 +1,18 @@
# Class: apache::php
#
# This class installs PHP for Apache
#
# Parameters:
# - $php_package
#
# Actions:
# - Install Apache PHP package
#
# Requires:
#
# Sample Usage:
#
class apache::php {
warning('apache::php is deprecated; please use apache::mod::php')
include ::apache::mod::php
}

View File

@@ -0,0 +1,15 @@
# Class: apache::proxy
#
# This class enabled the proxy module for Apache
#
# Actions:
# - Enables Apache Proxy module
#
# Requires:
#
# Sample Usage:
#
class apache::proxy {
warning('apache::proxy is deprecated; please use apache::mod::proxy')
include ::apache::mod::proxy
}

View File

@@ -0,0 +1,18 @@
# Class: apache::python
#
# This class installs Python for Apache
#
# Parameters:
# - $php_package
#
# Actions:
# - Install Apache Python package
#
# Requires:
#
# Sample Usage:
#
class apache::python {
warning('apache::python is deprecated; please use apache::mod::python')
include ::apache::mod::python
}

View File

@@ -0,0 +1,44 @@
# Class: apache::service
#
# Manages the Apache daemon
#
# Parameters:
#
# Actions:
# - Manage Apache service
#
# Requires:
#
# Sample Usage:
#
# sometype { 'foo':
# notify => Class['apache::service'],
# }
#
#
class apache::service (
$service_name = $::apache::params::service_name,
$service_enable = true,
$service_ensure = 'running',
) {
# The base class must be included first because parameter defaults depend on it
if ! defined(Class['apache::params']) {
fail('You must include the apache::params class before using any apache defined resources')
}
validate_bool($service_enable)
case $service_ensure {
true, false, 'running', 'stopped': {
$_service_ensure = $service_ensure
}
default: {
$_service_ensure = undef
}
}
service { 'httpd':
ensure => $_service_ensure,
name => $service_name,
enable => $service_enable,
}
}

View File

@@ -0,0 +1,18 @@
# Class: apache::ssl
#
# This class installs Apache SSL capabilities
#
# Parameters:
# - The $ssl_package name from the apache::params class
#
# Actions:
# - Install Apache SSL capabilities
#
# Requires:
#
# Sample Usage:
#
class apache::ssl {
warning('apache::ssl is deprecated; please use apache::mod::ssl')
include ::apache::mod::ssl
}

View File

@@ -0,0 +1,35 @@
# Class: apache::version
#
# Try to automatically detect the version by OS
#
class apache::version {
# This will be 5 or 6 on RedHat, 6 or wheezy on Debian, 12 or quantal on Ubuntu, 3 on Amazon, etc.
$osr_array = split($::operatingsystemrelease,'[\/\.]')
$distrelease = $osr_array[0]
if ! $distrelease {
fail("Class['apache::params']: Unparsable \$::operatingsystemrelease: ${::operatingsystemrelease}")
}
case $::osfamily {
'RedHat': {
if ($::operatingsystem == 'Fedora' and $distrelease >= 18) or ($::operatingsystem != 'Fedora' and $distrelease >= 7) {
$default = '2.4'
} else {
$default = '2.2'
}
}
'Debian': {
if $::operatingsystem == 'Ubuntu' and $::operatingsystemrelease >= 13.10 {
$default = '2.4'
} else {
$default = '2.2'
}
}
'FreeBSD': {
$default = '2.2'
}
default: {
fail("Class['apache::version']: Unsupported osfamily: ${::osfamily}")
}
}
}

View File

@@ -0,0 +1,560 @@
# Definition: apache::vhost
#
# This class installs Apache Virtual Hosts
#
# Parameters:
# - The $port to configure the host on
# - The $docroot provides the DocumentRoot variable
# - The $virtual_docroot provides VirtualDocumentationRoot variable
# - The $serveradmin will specify an email address for Apache that it will
# display when it renders one of it's error pages
# - The $ssl option is set true or false to enable SSL for this Virtual Host
# - The $priority of the site
# - The $servername is the primary name of the virtual host
# - The $serveraliases of the site
# - The $ip to configure the host on, defaulting to *
# - The $options for the given vhost
# - The $override for the given vhost (list of AllowOverride arguments)
# - The $vhost_name for name based virtualhosting, defaulting to *
# - The $logroot specifies the location of the virtual hosts logfiles, default
# to /var/log/<apache log location>/
# - The $log_level specifies the verbosity of the error log for this vhost. Not
# set by default for the vhost, instead the global server configuration default
# of 'warn' is used.
# - The $access_log specifies if *_access.log directives should be configured.
# - The $ensure specifies if vhost file is present or absent.
# - The $headers is a list of Header statement strings as per http://httpd.apache.org/docs/2.2/mod/mod_headers.html#header
# - The $request_headers is a list of RequestHeader statement strings as per http://httpd.apache.org/docs/2.2/mod/mod_headers.html#requestheader
# - $aliases is a list of Alias hashes for mod_alias as per http://httpd.apache.org/docs/current/mod/mod_alias.html
# each statement is a hash in the form of { alias => '/alias', path => '/real/path/to/directory' }
# - $directories is a lost of hashes for creating <Directory> statements as per http://httpd.apache.org/docs/2.2/mod/core.html#directory
# each statement is a hash in the form of { path => '/path/to/directory', <directive> => <value>}
# see README.md for list of supported directives.
#
# Actions:
# - Install Apache Virtual Hosts
#
# Requires:
# - The apache class
#
# Sample Usage:
#
# # Simple vhost definition:
# apache::vhost { 'site.name.fqdn':
# port => '80',
# docroot => '/path/to/docroot',
# }
#
# # Multiple Mod Rewrites:
# apache::vhost { 'site.name.fqdn':
# port => '80',
# docroot => '/path/to/docroot',
# rewrites => [
# {
# comment => 'force www domain',
# rewrite_cond => ['%{HTTP_HOST} ^([a-z.]+)?example.com$ [NC]', '%{HTTP_HOST} !^www. [NC]'],
# rewrite_rule => ['.? http://www.%1example.com%{REQUEST_URI} [R=301,L]']
# },
# {
# comment => 'prevent image hotlinking',
# rewrite_cond => ['%{HTTP_REFERER} !^$', '%{HTTP_REFERER} !^http://(www.)?example.com/ [NC]'],
# rewrite_rule => ['.(gif|jpg|png)$ - [F]']
# },
# ]
# }
#
# # SSL vhost with non-SSL rewrite:
# apache::vhost { 'site.name.fqdn':
# port => '443',
# ssl => true,
# docroot => '/path/to/docroot',
# }
# apache::vhost { 'site.name.fqdn':
# port => '80',
# docroot => '/path/to/other_docroot',
# custom_fragment => template("${module_name}/my_fragment.erb"),
# }
#
define apache::vhost(
$docroot,
$virtual_docroot = false,
$port = undef,
$ip = undef,
$ip_based = false,
$add_listen = true,
$docroot_owner = 'root',
$docroot_group = $::apache::params::root_group,
$docroot_mode = undef,
$serveradmin = undef,
$ssl = false,
$ssl_cert = $::apache::default_ssl_cert,
$ssl_key = $::apache::default_ssl_key,
$ssl_chain = $::apache::default_ssl_chain,
$ssl_ca = $::apache::default_ssl_ca,
$ssl_crl_path = $::apache::default_ssl_crl_path,
$ssl_crl = $::apache::default_ssl_crl,
$ssl_certs_dir = $::apache::params::ssl_certs_dir,
$ssl_protocol = undef,
$ssl_cipher = undef,
$ssl_honorcipherorder = undef,
$ssl_verify_client = undef,
$ssl_verify_depth = undef,
$ssl_options = undef,
$ssl_proxyengine = false,
$priority = undef,
$default_vhost = false,
$servername = $name,
$serveraliases = [],
$options = ['Indexes','FollowSymLinks','MultiViews'],
$override = ['None'],
$directoryindex = '',
$vhost_name = '*',
$logroot = $::apache::logroot,
$log_level = undef,
$access_log = true,
$access_log_file = undef,
$access_log_pipe = undef,
$access_log_syslog = undef,
$access_log_format = undef,
$access_log_env_var = undef,
$aliases = undef,
$directories = undef,
$error_log = true,
$error_log_file = undef,
$error_log_pipe = undef,
$error_log_syslog = undef,
$error_documents = [],
$fallbackresource = undef,
$scriptalias = undef,
$scriptaliases = [],
$proxy_dest = undef,
$proxy_pass = undef,
$suphp_addhandler = $::apache::params::suphp_addhandler,
$suphp_engine = $::apache::params::suphp_engine,
$suphp_configpath = $::apache::params::suphp_configpath,
$php_admin_flags = [],
$php_admin_values = [],
$no_proxy_uris = [],
$proxy_preserve_host = false,
$redirect_source = '/',
$redirect_dest = undef,
$redirect_status = undef,
$redirectmatch_status = undef,
$redirectmatch_regexp = undef,
$rack_base_uris = undef,
$headers = undef,
$request_headers = undef,
$rewrites = undef,
$rewrite_base = undef,
$rewrite_rule = undef,
$rewrite_cond = undef,
$setenv = [],
$setenvif = [],
$block = [],
$ensure = 'present',
$wsgi_application_group = undef,
$wsgi_daemon_process = undef,
$wsgi_daemon_process_options = undef,
$wsgi_import_script = undef,
$wsgi_import_script_options = undef,
$wsgi_process_group = undef,
$wsgi_script_aliases = undef,
$wsgi_pass_authorization = undef,
$custom_fragment = undef,
$itk = undef,
$action = undef,
$fastcgi_server = undef,
$fastcgi_socket = undef,
$fastcgi_dir = undef,
$additional_includes = [],
$apache_version = $::apache::apache_version,
$suexec_user_group = undef,
) {
# The base class must be included first because it is used by parameter defaults
if ! defined(Class['apache']) {
fail('You must include the apache base class before using any apache defined resources')
}
$apache_name = $::apache::params::apache_name
validate_re($ensure, '^(present|absent)$',
"${ensure} is not supported for ensure.
Allowed values are 'present' and 'absent'.")
validate_re($suphp_engine, '^(on|off)$',
"${suphp_engine} is not supported for suphp_engine.
Allowed values are 'on' and 'off'.")
validate_bool($ip_based)
validate_bool($access_log)
validate_bool($error_log)
validate_bool($ssl)
validate_bool($default_vhost)
validate_bool($ssl_proxyengine)
if $rewrites {
validate_array($rewrites)
validate_hash($rewrites[0])
}
if $suexec_user_group {
validate_re($suexec_user_group, '^\w+ \w+$',
"${suexec_user_group} is not supported for suexec_user_group. Must be 'user group'.")
}
# Deprecated backwards-compatibility
if $rewrite_base {
warning('Apache::Vhost: parameter rewrite_base is deprecated in favor of rewrites')
}
if $rewrite_rule {
warning('Apache::Vhost: parameter rewrite_rule is deprecated in favor of rewrites')
}
if $rewrite_cond {
warning('Apache::Vhost parameter rewrite_cond is deprecated in favor of rewrites')
}
if $wsgi_script_aliases {
validate_hash($wsgi_script_aliases)
}
if $wsgi_daemon_process_options {
validate_hash($wsgi_daemon_process_options)
}
if $wsgi_import_script_options {
validate_hash($wsgi_import_script_options)
}
if $itk {
validate_hash($itk)
}
if $log_level {
validate_re($log_level, '^(emerg|alert|crit|error|warn|notice|info|debug)$',
"Log level '${log_level}' is not one of the supported Apache HTTP Server log levels.")
}
if $access_log_file and $access_log_pipe {
fail("Apache::Vhost[${name}]: 'access_log_file' and 'access_log_pipe' cannot be defined at the same time")
}
if $error_log_file and $error_log_pipe {
fail("Apache::Vhost[${name}]: 'error_log_file' and 'error_log_pipe' cannot be defined at the same time")
}
if $fallbackresource {
validate_re($fallbackresource, '^/|disabled', 'Please make sure fallbackresource starts with a / (or is "disabled")')
}
if $ssl and $ensure == 'present' {
include ::apache::mod::ssl
# Required for the AddType lines.
include ::apache::mod::mime
}
if $virtual_docroot {
include ::apache::mod::vhost_alias
}
if $wsgi_daemon_process {
include ::apache::mod::wsgi
}
if $suexec_user_group {
include ::apache::mod::suexec
}
# This ensures that the docroot exists
# But enables it to be specified across multiple vhost resources
if ! defined(File[$docroot]) {
file { $docroot:
ensure => directory,
owner => $docroot_owner,
group => $docroot_group,
mode => $docroot_mode,
require => Package['httpd'],
}
}
# Same as above, but for logroot
if ! defined(File[$logroot]) {
file { $logroot:
ensure => directory,
require => Package['httpd'],
}
}
# Is apache::mod::passenger enabled (or apache::mod['passenger'])
$passenger_enabled = defined(Apache::Mod['passenger'])
# Define log file names
if $access_log_file {
$access_log_destination = "${logroot}/${access_log_file}"
} elsif $access_log_pipe {
$access_log_destination = $access_log_pipe
} elsif $access_log_syslog {
$access_log_destination = $access_log_syslog
} else {
if $ssl {
$access_log_destination = "${logroot}/${name}_access_ssl.log"
} else {
$access_log_destination = "${logroot}/${name}_access.log"
}
}
if $error_log_file {
$error_log_destination = "${logroot}/${error_log_file}"
} elsif $error_log_pipe {
$error_log_destination = $error_log_pipe
} elsif $error_log_syslog {
$error_log_destination = $error_log_syslog
} else {
if $ssl {
$error_log_destination = "${logroot}/${name}_error_ssl.log"
} else {
$error_log_destination = "${logroot}/${name}_error.log"
}
}
# Set access log format
if $access_log_format {
$_access_log_format = "\"${access_log_format}\""
} else {
$_access_log_format = 'combined'
}
if $access_log_env_var {
$_access_log_env_var = "env=${access_log_env_var}"
}
if $ip {
if $port {
$listen_addr_port = "${ip}:${port}"
$nvh_addr_port = "${ip}:${port}"
} else {
$listen_addr_port = undef
$nvh_addr_port = $ip
if ! $servername and ! $ip_based {
fail("Apache::Vhost[${name}]: must pass 'ip' and/or 'port' parameters for name-based vhosts")
}
}
} else {
if $port {
$listen_addr_port = $port
$nvh_addr_port = "${vhost_name}:${port}"
} else {
$listen_addr_port = undef
$nvh_addr_port = $name
if ! $servername {
fail("Apache::Vhost[${name}]: must pass 'ip' and/or 'port' parameters, and/or 'servername' parameter")
}
}
}
if $add_listen {
if $ip and defined(Apache::Listen[$port]) {
fail("Apache::Vhost[${name}]: Mixing IP and non-IP Listen directives is not possible; check the add_listen parameter of the apache::vhost define to disable this")
}
if ! defined(Apache::Listen[$listen_addr_port]) and $listen_addr_port and $ensure == 'present' {
::apache::listen { $listen_addr_port: }
}
}
if ! $ip_based {
if ! defined(Apache::Namevirtualhost[$nvh_addr_port]) and $ensure == 'present' and (versioncmp($apache_version, '2.4') < 0) {
::apache::namevirtualhost { $nvh_addr_port: }
}
}
# Load mod_rewrite if needed and not yet loaded
if $rewrites or $rewrite_cond {
if ! defined(Class['apache::mod::rewrite']) {
include ::apache::mod::rewrite
}
}
# Load mod_alias if needed and not yet loaded
if ($scriptalias or $scriptaliases != []) or ($redirect_source and $redirect_dest) {
if ! defined(Class['apache::mod::alias']) {
include ::apache::mod::alias
}
}
# Load mod_proxy if needed and not yet loaded
if ($proxy_dest or $proxy_pass) {
if ! defined(Class['apache::mod::proxy']) {
include ::apache::mod::proxy
}
if ! defined(Class['apache::mod::proxy_http']) {
include ::apache::mod::proxy_http
}
}
# Load mod_passenger if needed and not yet loaded
if $rack_base_uris {
if ! defined(Class['apache::mod::passenger']) {
include ::apache::mod::passenger
}
}
# Load mod_fastci if needed and not yet loaded
if $fastcgi_server and $fastcgi_socket {
if ! defined(Class['apache::mod::fastcgi']) {
include ::apache::mod::fastcgi
}
}
# Configure the defaultness of a vhost
if $priority {
$priority_real = $priority
} elsif $default_vhost {
$priority_real = '10'
} else {
$priority_real = '25'
}
# Check if mod_headers is required to process $headers/$request_headers
if $headers or $request_headers {
if ! defined(Class['apache::mod::headers']) {
include ::apache::mod::headers
}
}
## Apache include does not always work with spaces in the filename
$filename = regsubst($name, ' ', '_', 'G')
## Create a default directory list if none defined
if $directories {
if !is_hash($directories) and !(is_array($directories) and is_hash($directories[0])) {
fail("Apache::Vhost[${name}]: 'directories' must be either a Hash or an Array of Hashes")
}
$_directories = $directories
} else {
$_directory = {
provider => 'directory',
path => $docroot,
options => $options,
allow_override => $override,
directoryindex => $directoryindex,
}
if versioncmp($apache_version, '2.4') >= 0 {
$_directory_version = {
require => 'all granted',
}
} else {
$_directory_version = {
order => 'allow,deny',
allow => 'from all',
}
}
$_directories = [ merge($_directory, $_directory_version) ]
}
# Template uses:
# - $nvh_addr_port
# - $servername
# - $serveradmin
# - $docroot
# - $virtual_docroot
# - $options
# - $override
# - $logroot
# - $name
# - $aliases
# - $_directories
# - $log_level
# - $access_log
# - $access_log_destination
# - $_access_log_format
# - $_access_log_env_var
# - $error_log
# - $error_log_destination
# - $error_documents
# - $fallbackresource
# - $custom_fragment
# - $additional_includes
# block fragment:
# - $block
# directories fragment:
# - $passenger_enabled
# - $php_admin_flags
# - $php_admin_values
# - $directories (a list of key-value hashes is expected)
# fastcgi fragment:
# - $fastcgi_server
# - $fastcgi_socket
# - $fastcgi_dir
# proxy fragment:
# - $proxy_dest
# - $no_proxy_uris
# - $proxy_preserve_host (true to set ProxyPreserveHost to on and false to off
# rack fragment:
# - $rack_base_uris
# redirect fragment:
# - $redirect_source
# - $redirect_dest
# - $redirect_status
# header fragment
# - $headers
# requestheader fragment:
# - $request_headers
# rewrite fragment:
# - $rewrites
# scriptalias fragment:
# - $scriptalias
# - $scriptaliases
# - $ssl
# serveralias fragment:
# - $serveraliases
# setenv fragment:
# - $setenv
# - $setenvif
# ssl fragment:
# - $ssl
# - $ssl_cert
# - $ssl_key
# - $ssl_chain
# - $ssl_certs_dir
# - $ssl_ca
# - $ssl_crl
# - $ssl_crl_path
# - $ssl_verify_client
# - $ssl_verify_depth
# - $ssl_options
# suphp fragment:
# - $suphp_addhandler
# - $suphp_engine
# - $suphp_configpath
# wsgi fragment:
# - $wsgi_application_group
# - $wsgi_daemon_process
# - $wsgi_import_script
# - $wsgi_process_group
# - $wsgi_script_aliases
file { "${priority_real}-${filename}.conf":
ensure => $ensure,
path => "${::apache::vhost_dir}/${priority_real}-${filename}.conf",
content => template('apache/vhost.conf.erb'),
owner => 'root',
group => $::apache::params::root_group,
mode => '0644',
require => [
Package['httpd'],
File[$docroot],
File[$logroot],
],
notify => Service['httpd'],
}
if $::osfamily == 'Debian' {
$vhost_enable_dir = $::apache::vhost_enable_dir
$vhost_symlink_ensure = $ensure ? {
present => link,
default => $ensure,
}
file{ "${priority_real}-${filename}.conf symlink":
ensure => $vhost_symlink_ensure,
path => "${vhost_enable_dir}/${priority_real}-${filename}.conf",
target => "${::apache::vhost_dir}/${priority_real}-${filename}.conf",
owner => 'root',
group => $::apache::params::root_group,
mode => '0644',
require => File["${priority_real}-${filename}.conf"],
notify => Service['httpd'],
}
}
}

View File

@@ -0,0 +1,65 @@
{
"name": "puppetlabs-apache",
"version": "1.0.1",
"source": "https://github.com/puppetlabs/puppetlabs-apache",
"author": "Puppet Labs",
"license": "Apache-2.0",
"project_page": "https://github.com/puppetlabs/puppetlabs-apache",
"summary": "Puppet module for Apache",
"operatingsystem_support": [
{
"operatingsystem": "RedHat",
"operatingsystemrelease": [
"5",
"6",
"7"
]
},
{
"operatingsystem": "CentOS",
"operatingsystemrelease": [
"5",
"6",
"7"
]
},
{
"operatingsystem": "OracleLinux",
"operatingsystemrelease": [
"5",
"6",
"7"
]
},
{
"operatingsystem": "Scientific",
"operatingsystemrelease": [
"5",
"6",
"7"
]
},
{
"operatingsystem": "Debian",
"operatingsystemrelease": [
"6",
"7"
]
},
{
"operatingsystem": "Ubuntu",
"operatingsystemrelease": [
"10.04",
"12.04",
"14.04"
]
}
],
"requirements": [
{ "name": "puppet", "version_requirement": "3.x" }
],
"dependencies": []
}

View File

@@ -0,0 +1,446 @@
require 'spec_helper_acceptance'
require_relative './version.rb'
describe 'apache parameters', :unless => UNSUPPORTED_PLATFORMS.include?(fact('osfamily')) do
# Currently this test only does something on FreeBSD.
describe 'default_confd_files => false' do
it 'doesnt do anything' do
pp = "class { 'apache': default_confd_files => false }"
apply_manifest(pp, :catch_failures => true)
end
if fact('osfamily') == 'FreeBSD'
describe file("#{confd_dir}/no-accf.conf.erb") do
it { should_not be_file }
end
end
end
describe 'default_confd_files => true' do
it 'copies conf.d files' do
pp = "class { 'apache': default_confd_files => true }"
apply_manifest(pp, :catch_failures => true)
end
if fact('osfamily') == 'FreeBSD'
describe file("#{$confd_dir}/no-accf.conf.erb") do
it { should be_file }
end
end
end
describe 'when set adds a listen statement' do
it 'applys cleanly' do
pp = "class { 'apache': ip => '10.1.1.1', service_ensure => stopped }"
apply_manifest(pp, :catch_failures => true)
end
describe file($ports_file) do
it { should be_file }
it { should contain 'Listen 10.1.1.1' }
end
end
describe 'service tests => true' do
it 'starts the service' do
pp = <<-EOS
class { 'apache':
service_enable => true,
service_ensure => running,
}
EOS
apply_manifest(pp, :catch_failures => true)
end
describe service($service_name) do
it { should be_running }
it { should be_enabled }
end
end
describe 'service tests => false' do
it 'stops the service' do
pp = <<-EOS
class { 'apache':
service_enable => false,
service_ensure => stopped,
}
EOS
apply_manifest(pp, :catch_failures => true)
end
describe service($service_name) do
it { should_not be_running }
it { should_not be_enabled }
end
end
describe 'purge parameters => false' do
it 'applies cleanly' do
pp = <<-EOS
class { 'apache':
purge_configs => false,
purge_vdir => false,
}
EOS
shell("touch #{$confd_dir}/test.conf")
apply_manifest(pp, :catch_failures => true)
end
# Ensure the file didn't disappear.
describe file("#{$confd_dir}/test.conf") do
it { should be_file }
end
end
if fact('osfamily') != 'Debian'
describe 'purge parameters => true' do
it 'applies cleanly' do
pp = <<-EOS
class { 'apache':
purge_configs => true,
purge_vdir => true,
}
EOS
shell("touch #{$confd_dir}/test.conf")
apply_manifest(pp, :catch_failures => true)
end
# File should be gone
describe file("#{$confd_dir}/test.conf") do
it { should_not be_file }
end
end
end
describe 'serveradmin' do
it 'applies cleanly' do
pp = "class { 'apache': serveradmin => 'test@example.com' }"
apply_manifest(pp, :catch_failures => true)
end
describe file($vhost) do
it { should be_file }
it { should contain 'ServerAdmin test@example.com' }
end
end
describe 'sendfile' do
describe 'setup' do
it 'applies cleanly' do
pp = "class { 'apache': sendfile => 'On' }"
apply_manifest(pp, :catch_failures => true)
end
end
describe file($conf_file) do
it { should be_file }
it { should contain 'EnableSendfile On' }
end
describe 'setup' do
it 'applies cleanly' do
pp = "class { 'apache': sendfile => 'Off' }"
apply_manifest(pp, :catch_failures => true)
end
end
describe file($conf_file) do
it { should be_file }
it { should contain 'Sendfile Off' }
end
end
describe 'error_documents' do
describe 'setup' do
it 'applies cleanly' do
pp = "class { 'apache': error_documents => true }"
apply_manifest(pp, :catch_failures => true)
end
end
describe file($conf_file) do
it { should be_file }
it { should contain 'Alias /error/' }
end
end
describe 'timeout' do
describe 'setup' do
it 'applies cleanly' do
pp = "class { 'apache': timeout => '1234' }"
apply_manifest(pp, :catch_failures => true)
end
end
describe file($conf_file) do
it { should be_file }
it { should contain 'Timeout 1234' }
end
end
describe 'httpd_dir' do
describe 'setup' do
it 'applies cleanly' do
pp = <<-EOS
class { 'apache': httpd_dir => '/tmp', service_ensure => stopped }
include 'apache::mod::mime'
EOS
apply_manifest(pp, :catch_failures => true)
end
end
describe file("#{$confd_dir}/mime.conf") do
it { should be_file }
it { should contain 'AddLanguage eo .eo' }
end
end
describe 'server_root' do
describe 'setup' do
it 'applies cleanly' do
pp = "class { 'apache': server_root => '/tmp/root', service_ensure => stopped }"
apply_manifest(pp, :catch_failures => true)
end
end
describe file($conf_file) do
it { should be_file }
it { should contain 'ServerRoot "/tmp/root"' }
end
end
describe 'confd_dir' do
describe 'setup' do
it 'applies cleanly' do
pp = "class { 'apache': confd_dir => '/tmp/root', service_ensure => stopped }"
apply_manifest(pp, :catch_failures => true)
end
end
if $apache_version == '2.4'
describe file($conf_file) do
it { should be_file }
it { should contain 'IncludeOptional "/tmp/root/*.conf"' }
end
else
describe file($conf_file) do
it { should be_file }
it { should contain 'Include "/tmp/root/*.conf"' }
end
end
end
describe 'conf_template' do
describe 'setup' do
it 'applies cleanly' do
pp = "class { 'apache': conf_template => 'another/test.conf.erb', service_ensure => stopped }"
shell("mkdir -p #{default['distmoduledir']}/another/templates")
shell("echo 'testcontent' >> #{default['distmoduledir']}/another/templates/test.conf.erb")
apply_manifest(pp, :catch_failures => true)
end
end
describe file($conf_file) do
it { should be_file }
it { should contain 'testcontent' }
end
end
describe 'servername' do
describe 'setup' do
it 'applies cleanly' do
pp = "class { 'apache': servername => 'test.server', service_ensure => stopped }"
apply_manifest(pp, :catch_failures => true)
end
end
describe file($conf_file) do
it { should be_file }
it { should contain 'ServerName "test.server"' }
end
end
describe 'user' do
describe 'setup' do
it 'applies cleanly' do
pp = <<-EOS
class { 'apache':
manage_user => true,
manage_group => true,
user => 'testweb',
group => 'testweb',
}
EOS
apply_manifest(pp, :catch_failures => true)
end
end
describe user('testweb') do
it { should exist }
it { should belong_to_group 'testweb' }
end
describe group('testweb') do
it { should exist }
end
end
describe 'logformats' do
describe 'setup' do
it 'applies cleanly' do
pp = <<-EOS
class { 'apache':
log_formats => {
'vhost_common' => '%v %h %l %u %t \\\"%r\\\" %>s %b',
'vhost_combined' => '%v %h %l %u %t \\\"%r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-agent}i\\\"',
}
}
EOS
apply_manifest(pp, :catch_failures => true)
end
end
describe file($conf_file) do
it { should be_file }
it { should contain 'LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common' }
it { should contain 'LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" vhost_combined' }
end
end
describe 'keepalive' do
describe 'setup' do
it 'applies cleanly' do
pp = "class { 'apache': keepalive => 'On', keepalive_timeout => '30', max_keepalive_requests => '200' }"
apply_manifest(pp, :catch_failures => true)
end
end
describe file($conf_file) do
it { should be_file }
it { should contain 'KeepAlive On' }
it { should contain 'KeepAliveTimeout 30' }
it { should contain 'MaxKeepAliveRequests 200' }
end
end
describe 'logging' do
describe 'setup' do
it 'applies cleanly' do
pp = <<-EOS
if $::osfamily == 'RedHat' and $::selinux == 'true' {
$semanage_package = $::operatingsystemmajrelease ? {
'5' => 'policycoreutils',
'default' => 'policycoreutils-python',
}
package { $semanage_package: ensure => installed }
exec { 'set_apache_defaults':
command => 'semanage fcontext -a -t httpd_log_t "/apache_spec(/.*)?"',
path => '/bin:/usr/bin/:/sbin:/usr/sbin',
require => Package[$semanage_package],
}
exec { 'restorecon_apache':
command => 'restorecon -Rv /apache_spec',
path => '/bin:/usr/bin/:/sbin:/usr/sbin',
before => Service['httpd'],
require => Class['apache'],
}
}
file { '/apache_spec': ensure => directory, }
class { 'apache': logroot => '/apache_spec' }
EOS
apply_manifest(pp, :catch_failures => true)
end
end
describe file("/apache_spec/#{$error_log}") do
it { should be_file }
end
end
describe 'ports_file' do
it 'applys cleanly' do
pp = <<-EOS
file { '/apache_spec': ensure => directory, }
class { 'apache':
ports_file => '/apache_spec/ports_file',
ip => '10.1.1.1',
service_ensure => stopped
}
EOS
apply_manifest(pp, :catch_failures => true)
end
describe file('/apache_spec/ports_file') do
it { should be_file }
it { should contain 'Listen 10.1.1.1' }
end
end
describe 'server_tokens' do
it 'applys cleanly' do
pp = <<-EOS
class { 'apache':
server_tokens => 'Minor',
}
EOS
apply_manifest(pp, :catch_failures => true)
end
describe file($conf_file) do
it { should be_file }
it { should contain 'ServerTokens Minor' }
end
end
describe 'server_signature' do
it 'applys cleanly' do
pp = <<-EOS
class { 'apache':
server_signature => 'testsig',
service_ensure => stopped,
}
EOS
apply_manifest(pp, :catch_failures => true)
end
describe file($conf_file) do
it { should be_file }
it { should contain 'ServerSignature testsig' }
end
end
describe 'trace_enable' do
it 'applys cleanly' do
pp = <<-EOS
class { 'apache':
trace_enable => 'Off',
}
EOS
apply_manifest(pp, :catch_failures => true)
end
describe file($conf_file) do
it { should be_file }
it { should contain 'TraceEnable Off' }
end
end
describe 'package_ensure' do
it 'applys cleanly' do
pp = <<-EOS
class { 'apache':
package_ensure => present,
}
EOS
apply_manifest(pp, :catch_failures => true)
end
describe package($package_name) do
it { should be_installed }
end
end
end

View File

@@ -0,0 +1,87 @@
require 'spec_helper_acceptance'
case fact('osfamily')
when 'RedHat'
vhostd = '/etc/httpd/conf.d'
when 'Debian'
vhostd = '/etc/apache2/sites-available'
end
describe 'apache ssl', :unless => UNSUPPORTED_PLATFORMS.include?(fact('osfamily')) do
describe 'ssl parameters' do
it 'runs without error' do
pp = <<-EOS
class { 'apache':
service_ensure => stopped,
default_ssl_vhost => true,
default_ssl_cert => '/tmp/ssl_cert',
default_ssl_key => '/tmp/ssl_key',
default_ssl_chain => '/tmp/ssl_chain',
default_ssl_ca => '/tmp/ssl_ca',
default_ssl_crl_path => '/tmp/ssl_crl_path',
default_ssl_crl => '/tmp/ssl_crl',
}
EOS
apply_manifest(pp, :catch_failures => true)
end
describe file("#{vhostd}/15-default-ssl.conf") do
it { should be_file }
it { should contain 'SSLCertificateFile "/tmp/ssl_cert"' }
it { should contain 'SSLCertificateKeyFile "/tmp/ssl_key"' }
it { should contain 'SSLCertificateChainFile "/tmp/ssl_chain"' }
it { should contain 'SSLCACertificateFile "/tmp/ssl_ca"' }
it { should contain 'SSLCARevocationPath "/tmp/ssl_crl_path"' }
it { should contain 'SSLCARevocationFile "/tmp/ssl_crl"' }
end
end
describe 'vhost ssl parameters' do
it 'runs without error' do
pp = <<-EOS
class { 'apache':
service_ensure => stopped,
}
apache::vhost { 'test_ssl':
docroot => '/tmp/test',
ssl => true,
ssl_cert => '/tmp/ssl_cert',
ssl_key => '/tmp/ssl_key',
ssl_chain => '/tmp/ssl_chain',
ssl_ca => '/tmp/ssl_ca',
ssl_crl_path => '/tmp/ssl_crl_path',
ssl_crl => '/tmp/ssl_crl',
ssl_certs_dir => '/tmp',
ssl_protocol => 'test',
ssl_cipher => 'test',
ssl_honorcipherorder => 'test',
ssl_verify_client => 'test',
ssl_verify_depth => 'test',
ssl_options => ['test', 'test1'],
ssl_proxyengine => true,
}
EOS
apply_manifest(pp, :catch_failures => true)
end
describe file("#{vhostd}/25-test_ssl.conf") do
it { should be_file }
it { should contain 'SSLCertificateFile "/tmp/ssl_cert"' }
it { should contain 'SSLCertificateKeyFile "/tmp/ssl_key"' }
it { should contain 'SSLCertificateChainFile "/tmp/ssl_chain"' }
it { should contain 'SSLCACertificateFile "/tmp/ssl_ca"' }
it { should contain 'SSLCARevocationPath "/tmp/ssl_crl_path"' }
it { should contain 'SSLCARevocationFile "/tmp/ssl_crl"' }
it { should contain 'SSLProxyEngine On' }
it { should contain 'SSLProtocol test' }
it { should contain 'SSLCipherSuite test' }
it { should contain 'SSLHonorCipherOrder test' }
it { should contain 'SSLVerifyClient test' }
it { should contain 'SSLVerifyDepth test' }
it { should contain 'SSLOptions test test1' }
end
end
end

Some files were not shown because too many files have changed in this diff Show More