Ottomata has submitted this change and it was merged. Change subject: Adding puppet Limn module. ......................................................................
Adding puppet Limn module. Change-Id: Idb71d214135faac6d3c381aef8fcb2536f54644e --- A modules/limn/README.md A modules/limn/manifests/init.pp A modules/limn/manifests/instance.pp A modules/limn/manifests/instance/proxy.pp A modules/limn/templates/init-limn.conf.erb A modules/limn/templates/vhost-limn-proxy.conf.erb 6 files changed, 307 insertions(+), 0 deletions(-) Approvals: Faidon: Looks good to me, approved jenkins-bot: Verified diff --git a/modules/limn/README.md b/modules/limn/README.md new file mode 100644 index 0000000..c2b5477 --- /dev/null +++ b/modules/limn/README.md @@ -0,0 +1,53 @@ +[Limn][https://github.com/wikimedia/limn] puppet module. + +# Usage + +```puppet + +# Spawn up a limn instance called 'my-instance'. +# Data files are expected to be at +# /var/lib/limn/my-instance/data. +limn::instance { "my-instance": } + +``` + +The above will start a Limn instance listening on port 8081, with an +apache VirtualHost reverse proxying to it on port 80. If the defaults +for the VirtualHost don't work for you, you can set proxy => false +on the instance and set it up yourself or using the limn::instance::proxy +define. + +Note that the limn class by default does not attempt to install a limn +package. There is not currently a supported limn .deb package, so we +recommend cloning the [limn repository][https://github.com/wikimedia/limn] +directly into /usr/local/share/limn (or elsewhere if you set base_directory to something non default on limn::instance). Or deploy limn to wherever you +see fit. + +## Example: + +```bash +# Install Limn at /usr/local/share/limn +sudo git clone https://github.com/wikimedia/limn.git /usr/local/share/limn +``` + +```puppet + +class role::analytics::reportcard { + # spawn up a limn instance called 'reportcard' + # using the defaults. + limn::instance { 'reportcard': } + + # We want an Apache VirtualHost to proxy + # 'reportcard.wmflabs.org' to the reportcard + # limn instance. + limn::instance::proxy { 'reportcard': + server_name => 'reportcard.wmflabs.org', + require => Limn::Instance['reportcard'], + } +} +``` + +# Requirements +* puppet-labs' apache puppet module. + + diff --git a/modules/limn/manifests/init.pp b/modules/limn/manifests/init.pp new file mode 100644 index 0000000..84d1b14 --- /dev/null +++ b/modules/limn/manifests/init.pp @@ -0,0 +1,65 @@ +# == Class limn +# Installs limn. +# To spawn up a limn server instance, use the limn::instance define. +# +# NOTE: This does not install limn. You must do that youself. +# When you use limn::instance, set $base_directory to the location +# in which you installed limn. +# +# == Parameters +# $var_directory - Default path to Limn var directory. This will also be limn user's home directory. Default: /var/lib/limn +# $log_directory - Default path to Limn server logs. Default: /var/log/limn +# $user - Limn user. Default: limn +# $group - Limn group. Default: limn +# +class limn( + $var_directory = '/var/lib/limn', + $log_directory = '/var/log/limn', + $install = false) +{ + $user = 'limn' + $group = 'limn' + + # Make sure nodejs is installed. + if (!defined(Package['nodejs'])) { + package { 'nodejs': + ensure => installed, + } + } + + group { $group: + ensure => present, + system => true, + } + + user { $user: + ensure => present, + gid => $group, + home => $var_directory, + managehome => false, + system => true, + require => Group[$group], + } + + # Default limn containing data directory. + # Instances default to storing data in + # $var_directory/$name + file { $var_directory: + ensure => 'directory', + owner => $user, + group => $group, + mode => '0755', + require => [User[$user], Group[$group]], + } + + # Default limn log directory. + # Instances will log to + # $log_directory/limn-$name.log + file { $log_directory: + ensure => 'directory', + owner => $user, + group => $group, + mode => '0755', + require => [User[$user], Group[$group]], + } +} \ No newline at end of file diff --git a/modules/limn/manifests/instance.pp b/modules/limn/manifests/instance.pp new file mode 100644 index 0000000..5d0128d --- /dev/null +++ b/modules/limn/manifests/instance.pp @@ -0,0 +1,97 @@ +# == Define limn::instance +# Starts up a Limn Server instance. +# +# == Parameters: +# $port - Listen port for Limn instance. Default: 8081 +# $environment - Node environment. Default: production +# $base_directory - Limn install base directory. Default: /usr/local/share/limn +# $var_directory - Limn instance var directory. Limn datafiles live here. Default: /var/lib/limn/$name +# $log_file - Limn instance log file. Default: /var/log/limn/limn-$name.log +# $ensure - present|absent. Default: present +# +define limn::instance ( + $port = 8081, + $environment = 'production', + $base_directory = '/usr/local/share/limn', + $var_directory = "/var/lib/limn/${name}", + $log_file = "/var/log/limn/limn-${name}.log", + $proxy = true, + $ensure = 'present') +{ + require limn + + file { $base_directory: + ensure => 'directory', + owner => $limn::user, + group => $limn::group, + mode => '0775', + } + + file { $var_directory: + ensure => 'directory', + owner => $limn::user, + group => $limn::group, + mode => '0775', + } + + # The upstart init conf will start server.co + # logging to this file. + file { $log_file: + ensure => 'file', + owner => $limn::user, + group => $limn::group, + mode => '0775', + } + + # symlink $base_directory/var/{css,js,vendor} + # in $var_directory + $symlink_ensure = $ensure ? { + present => 'link', + default => 'absent', + } + file { "${var_directory}/css": + ensure => $symlink_ensure, + target => "${base_directory}/var/css", + } + file { "${var_directory}/js": + ensure => $symlink_ensure, + target => "${base_directory}/var/js", + } + file { "${var_directory}/vendor": + ensure => $symlink_ensure, + target => "${base_directory}/var/vendor", + } + + # Install an upstart init file for this limn server instance. + file { "/etc/init/limn-${name}.conf": + ensure => $ensure, + content => template('limn/init-limn.conf.erb'), + owner => 'root', + group => 'root', + mode => '0444', + require => [File[$var_directory], File[$log_file]], + } + + # Symlink an /etc/init.d script to upstart-job + # for SysV compatibility. + $sysv_ensure = $ensure ? { + present => 'link', + default => 'absent', + } + file { "/etc/init.d/limn-${name}": + ensure => $sysv_ensure, + target => '/lib/init/upstart-job', + require => File["/etc/init/limn-${name}.conf"], + } + + # Start the service. + $service_ensure = $ensure ? { + present => 'running', + default => 'stopped', + } + service { "limn-${name}": + ensure => $service_ensure, + provider => 'upstart', + subscribe => File["/etc/init/limn-${name}.conf"], + } +} \ No newline at end of file diff --git a/modules/limn/manifests/instance/proxy.pp b/modules/limn/manifests/instance/proxy.pp new file mode 100644 index 0000000..d144575 --- /dev/null +++ b/modules/limn/manifests/instance/proxy.pp @@ -0,0 +1,40 @@ +# == Define limn::instance::proxy +# Sets up an apache mod_rewrite proxy for proxying to a Limn instance. +# Static files in $document_root will be served by apache. +# This define depends on the apache puppet module. +# +# == Parameters: +# $port - Apache port to Listen on. Default: 80. +# $limn_host - Hostname or IP of Limn instnace. Default: 127.0.0.1 +# $limn_port - Port of Limn instance. Default: 8081 +# $document_root - Path to Apache document root. This should be the limn::instance $var_directory. Default: /usr/local/limn/var. +# $server_name - Named VirtualHost. Default: "$name.$domain" +# $server_aliases - Server name aliases. Default: none. +# +define limn::instance::proxy ( + $port = 80, + $limn_host = '127.0.0.1', + $limn_port = '8081', + $document_root = '/usr/local/share/limn/var', + $server_name = "${name}.${::domain}", + $server_aliases = '') +{ + # need apache and mod_rewrite + class { 'apache': + serveradmin => $server_admin, + default_mods => true, + } + apache::mod { 'rewrite': } + + # Configure the Apache Limn instance proxy VirtualHost. + $priority = 10 + file { "${priority}-limn-${name}.conf": + path => "${apache::params::vdir}/${priority}-limn-${name}.conf", + content => template('limn/vhost-limn-proxy.conf.erb'), + owner => 'root', + group => 'root', + mode => '0444', + require => [Package['httpd'], Apache::Mod['rewrite']], + notify => Service['httpd'], + } +} diff --git a/modules/limn/templates/init-limn.conf.erb b/modules/limn/templates/init-limn.conf.erb new file mode 100644 index 0000000..018ca13 --- /dev/null +++ b/modules/limn/templates/init-limn.conf.erb @@ -0,0 +1,26 @@ +# Note: This file is managed by Puppet. + +# Limn <%= name %> Server Instance + +description "Limn <%= name %> Server Instance" + +start on runlevel [2345] +stop on starting rc RUNLEVEL=[016] + +respawn +respawn limit 2 5 + +umask 007 + +kill timeout 300 + +env NODE_ENV=<%= environment %> +env LIMN_PORT=<%= port %> +env LIMN_VARDIR=<%= var_directory %> + +setuid <%= scope.lookupvar('limn::user') %> +setgid <%= scope.lookupvar('limn::group') %> + +console output +chdir <%= base_directory %> +exec ./node_modules/.bin/coco ./server/server.co >> <%= log_file %> diff --git a/modules/limn/templates/vhost-limn-proxy.conf.erb b/modules/limn/templates/vhost-limn-proxy.conf.erb new file mode 100644 index 0000000..dd613f4 --- /dev/null +++ b/modules/limn/templates/vhost-limn-proxy.conf.erb @@ -0,0 +1,26 @@ +<VirtualHost *:80> + ServerName <%= server_name %> +<% if server_aliases.is_a? Array -%> +<% server_aliases.each do |name| %><%= " ServerAlias #{name}\n" %><% end %> +<% elsif server_aliases != '' -%> +<%= " ServerAlias #{server_aliases}" %> +<% end -%> + + DocumentRoot <%= document_root %> + + LogLevel warn + ErrorLog /var/log/<%= scope.lookupvar("apache::params::apache_name") %>/<%= name %>_error.log + CustomLog /var/log/<%= scope.lookupvar("apache::params::apache_name") %>/<%= name %>_access.log combined + + ProxyRequests Off + <Proxy *> + Order allow,deny + Allow from all + </Proxy> + + # If the file does not exist, assume this is a dynamic + # request and send it to the Limn instance. + RewriteEngine On + RewriteCond <%= document_root %>/%{REQUEST_FILENAME} !-s + RewriteRule "^(.*)" "http://<%= limn_host %>:<%= limn_port %>$1" [P] +</VirtualHost> -- To view, visit https://gerrit.wikimedia.org/r/49710 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: Idb71d214135faac6d3c381aef8fcb2536f54644e Gerrit-PatchSet: 19 Gerrit-Project: operations/puppet Gerrit-Branch: production Gerrit-Owner: Ottomata <[email protected]> Gerrit-Reviewer: Diederik <[email protected]> Gerrit-Reviewer: Dsc <[email protected]> Gerrit-Reviewer: Faidon <[email protected]> Gerrit-Reviewer: Jgreen <[email protected]> Gerrit-Reviewer: Mark Bergsma <[email protected]> Gerrit-Reviewer: Milimetric <[email protected]> Gerrit-Reviewer: Ottomata <[email protected]> Gerrit-Reviewer: Stefan.petrea <[email protected]> Gerrit-Reviewer: jenkins-bot _______________________________________________ MediaWiki-commits mailing list [email protected] https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits
