diff --git a/manifests/instance.pp b/manifests/instance.pp index 3828f3d..bc74df2 100644 --- a/manifests/instance.pp +++ b/manifests/instance.pp @@ -1,154 +1,156 @@ # == Defined Type: gunicorn::instance # # gunicorn::instance defines an instance of gunicorn # # === Parameters # # [*ensure*] # Whether the instance should be enabled, present (but disabled) or absent. # # [*environment*] # A hash of environment variables to start the service with. # # [*executable*] # The wsgi callable to pass to gunicorn # # [*settings*] # a hash of settings for the given site. # # === Examples # # gunicorn::instance {'foo': # ensure => enabled, # environment => { # FOOENV => 'foovar', # } # executable => 'foo.wsgi:app' # user => 'foouser', # group => 'foogroup', -# config_mode => 0644 +# config_mode => 0644, # settings => { # plugin => 'python3', # protocol => $uwsgi_protocol, # socket => $uwsgi_listen_address, # workers => $uwsgi_workers, # max_requests => $uwsgi_max_requests, # max_requests_delta => $uwsgi_max_requests_delta, # worker_reload_mercy => $uwsgi_reload_mercy, # reload_mercy => $uwsgi_reload_mercy, # uid => $user, # gid => $user, # module => 'swh.storage.api.server', # callable => 'run_from_webserver', # } # } # # === Authors # # Nicolas Dandrimont # # === Copyright # # Copyright 2017 The Software Heritage developers # define gunicorn::instance ( $executable, $user = 'root', $group = 'root', $ensure = 'enabled', $config_mode = '0644', $working_dir = undef, + $config_base_module = undef, $log_only_errors = true, $settings = {}, $environment = {} ) { $config_file = "/etc/gunicorn/instances/${name}.cfg" $service_name = "gunicorn-${name}" $unit_name = "${service_name}.service" $tmpfile_name = "${service_name}.conf" $runtime_dir = "/run/gunicorn/${name}" if $working_dir { $working_dir_override = $working_dir } else { $working_dir_override = $runtime_dir } if $log_only_errors { $log_only_errors_str = 'True' } else { $log_only_errors_str = 'False' } case $ensure { default: { err("Unknown value ensure => ${ensure}.") } 'enabled', 'present': { include ::gunicorn # Uses variables: # - $settings # - $name # - $log_only_errors_str + # - $config_base_module file {$config_file: ensure => present, owner => $user, group => $group, mode => $config_mode, content => template('gunicorn/gunicorn-instance.cfg.erb'), notify => Service[$service_name], } # Uses variables: # - $config_file # - $environment # - $executable # - $group # - $name # - $runtime_dir # - $user # - $working_dir_override ::systemd::unit_file {$unit_name: ensure => present, content => template('gunicorn/gunicorn-instance.service.erb'), } ~> Service[$service_name] # Uses variables: # - $group # - $name # - $runtime_dir # - $user ::systemd::tmpfile {$tmpfile_name: ensure => present, content => template('gunicorn/gunicorn-instance.tmpfiles.erb'), } $service_enable = $ensure ? { 'enabled' => true, 'present' => undef, } service {$service_name: ensure => 'running', enable => $service_enable, restart => "/bin/systemctl reload ${service_name}.service", require => [ File[$config_file], ], } } 'absent': { ::systemd::unit_file {$unit_name: ensure => absent, } ::systemd::tmpfile {$tmpfile_name: ensure => absent, } file {$config_file: ensure => absent, } } } } diff --git a/templates/gunicorn-instance.cfg.erb b/templates/gunicorn-instance.cfg.erb index 2ad7687..cb2187d 100644 --- a/templates/gunicorn-instance.cfg.erb +++ b/templates/gunicorn-instance.cfg.erb @@ -1,37 +1,42 @@ # Gunicorn instance configuration. # Managed by puppet (class gunicorn::instance <%= @name %>); changes will be lost +<%- if @config_base_module -%> +# import all settings from the base module +from <%= @config_base_module %> import * +<%- end -%> + import traceback import gunicorn.glogging class Logger(gunicorn.glogging.Logger): log_only_errors = <%= @log_only_errors_str %> def access(self, resp, req, environ, request_time): """ See http://httpd.apache.org/docs/2.0/logs.html#combined for format details """ if not (self.cfg.accesslog or self.cfg.logconfig or self.cfg.syslog): return # wrap atoms: # - make sure atoms will be test case insensitively # - if atom doesn't exist replace it by '-' atoms = self.atoms(resp, req, environ, request_time) safe_atoms = self.atoms_wrapper_class(atoms) try: if self.log_only_errors and str(atoms['s']) == '200': return self.access_log.info(self.cfg.access_log_format % safe_atoms, extra={'swh_atoms': atoms}) except: self.exception('Failed processing access log entry') logger_class = Logger logconfig = '/etc/gunicorn/logconfig.ini' # custom settings <% @settings.each do |key, value| -%> <%= key %> = <%= value.to_json %> <% end -%>