Commit 29840f404cbb15f78ea1a5aa86e439d72c1aaffb

Authored by Sergio Oliveira
1 parent 7e5efbca

Adding supervisor module

puppet/modules/supervisor/README.md 0 → 100644
... ... @@ -0,0 +1,24 @@
  1 +Puppet Supervisor
  2 +=================
  3 +
  4 +Install and manage apps in supervisord
  5 +
  6 +
  7 +Usage
  8 +=================
  9 +
  10 +Include supervisor class
  11 +```puppet
  12 +include supervisor
  13 +```
  14 +
  15 +Install your app using defined type supervisor::app
  16 +
  17 +```puppet
  18 +supervisor::app { 'your-app-title':
  19 + app_name => 'your-app-name' # Default to 'your-app-title'
  20 + command => 'The command that will be run this app', # required
  21 + directory => 'Path where your command will be run' # required
  22 + user => 'User to execute this app' # Default to ubuntu
  23 +}
  24 +```
0 25 \ No newline at end of file
... ...
puppet/modules/supervisor/files/debian-isnok 0 → 100755
... ... @@ -0,0 +1,217 @@
  1 +#! /bin/sh
  2 +#
  3 +# supervisor built from skeleton /etc/init.d/ script.
  4 +#
  5 +# skeleton by Miquel van Smoorenburg <miquels@cistron.nl>.
  6 +# Modified for Debian by Ian Murdock <imurdock@gnu.ai.mit.edu>.
  7 +# Further changes by Javier Fernandez-Sanguino <jfs@debian.org>.
  8 +# More changes by Konstantin Martini <isnok@tuxcode.org>.
  9 +#
  10 +# Version: @(#)supervisor 0.8 25-Jun-2013 isnok@tuxcode.org
  11 +#
  12 +### BEGIN INIT INFO
  13 +# Provides: supervisor
  14 +# Required-Start: $remote_fs $network $named
  15 +# Required-Stop: $remote_fs $network $named
  16 +# Default-Start: 2 3 4 5
  17 +# Default-Stop: 0 1 6
  18 +# Short-Description: Start/stop supervisord
  19 +# Description: Start/stop supervisor daemon and its configured
  20 +# subprocesses.
  21 +### END INIT INFO
  22 +
  23 +
  24 +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
  25 +#DAEMON=/usr/bin/supervisord # Debian package version (presently 3.0a8-1)
  26 +DAEMON=/usr/local/bin/supervisord # Python package index (pypi) version (3.0b1)
  27 +NAME=supervisord
  28 +DESC="supervisord"
  29 +
  30 +CONFIGFILE=/etc/supervisord.conf # the supervisord config file
  31 +SUPERVISORCTL=/usr/local/bin/supervisorctl # used for reload command(s)
  32 +#SUPERVISORCTL=/usr/bin/supervisorctl # again: official deb version
  33 +
  34 +if [ ! -x $DAEMON ]; then
  35 + echo "ERROR: Not executable: $DAEMON"
  36 + exit 0
  37 +fi
  38 +
  39 +LOGDIR=/var/log/supervisor
  40 +PIDFILE=/var/run/$NAME.pid
  41 +DODTIME=5 # Time to wait for the server to die, in seconds
  42 + # If this value is set too low you might not
  43 + # let some servers to die gracefully and
  44 + # 'restart' will not work.
  45 +
  46 +# fix some args for certain commands
  47 +DAEMON_ARGS="-c$CONFIGFILE"
  48 +CTL_ARGS="-c$CONFIGFILE"
  49 +STARTSTOP_ARGS="--quiet --pidfile $PIDFILE --exec $DAEMON"
  50 +
  51 +# Include supervisor defaults if available
  52 +if [ -r /etc/default/supervisor ]; then
  53 + . /etc/default/supervisor
  54 +fi
  55 +
  56 +set -e
  57 +
  58 +dod_sleep () {
  59 + if [ -n "$DODTIME" ]; then
  60 + sleep "$DODTIME"s
  61 + fi
  62 +}
  63 +
  64 +running_pid () {
  65 + # Check if a pid's cmdline contains a string (name).
  66 + # This should work for all users.
  67 + pid="$1"
  68 + name="$2"
  69 + if [ -z "$pid" ]; then
  70 + return 1 # no pid given
  71 + fi
  72 + if [ ! -d /proc/"$pid" ]; then
  73 + return 1 # no /proc/$pid directory
  74 + fi
  75 + if cat /proc/"$pid"/cmdline | tr "\000" "\n"| grep -q "$name"; then
  76 + return 0
  77 + else
  78 + return 1 # $pid does not match $name
  79 + fi
  80 +}
  81 +
  82 +running () {
  83 + # Check if DAEMON is running by examining $PIDFILE.
  84 + # If this succeeds, it sets $pid (a side effect being used).
  85 +
  86 + if [ ! -f "$PIDFILE" ]; then
  87 + return 1 # No pidfile, probably no daemon present.
  88 + fi
  89 + # Now, obtain the pid and check it's /proc cmdline:
  90 + pid="$(cat $PIDFILE)"
  91 + if running_pid "$pid" "$DAEMON"; then
  92 + return 0
  93 + else
  94 + return 1
  95 + fi
  96 +}
  97 +
  98 +normal_start () {
  99 + start-stop-daemon $STARTSTOP_ARGS --start \
  100 + -- "$DAEMON_ARGS" $DAEMON_OPTS
  101 + if [ ! -f "$PIDFILE" ]; then
  102 + sleep 1 # grace time to create PIDFILE
  103 + fi
  104 +}
  105 +
  106 +normal_stop () {
  107 + #start-stop-daemon $STARTSTOP_ARGS --stop --oknodo
  108 + "$SUPERVISORCTL" $CTL_ARGS shutdown
  109 +}
  110 +
  111 +force_stop () {
  112 + # Forcefully stop a running DAEMON.
  113 + if running; then
  114 + kill -15 "$pid"
  115 + dod_sleep
  116 + # Check again, try harder if needed.
  117 + if running; then
  118 + kill -9 "$pid"
  119 + dod_sleep
  120 + if running; then
  121 + echo "Unable to kill running $NAME process (pid=$pid)!"
  122 + exit 1
  123 + fi
  124 + fi
  125 + fi
  126 + rm -f "$PIDFILE"
  127 + return 0
  128 +}
  129 +
  130 +ctl_reload () {
  131 + # make supervisord reload it's config
  132 + if [ -x "$SUPERVISORCTL" ]; then
  133 + "$SUPERVISORCTL" $CTL_ARGS reload
  134 + else
  135 + return 1
  136 + fi
  137 +}
  138 +
  139 +ctl_status () {
  140 + # show stati of supervised processes.
  141 + # do not mind if this fails.
  142 + "$SUPERVISORCTL" $CTL_ARGS status
  143 +}
  144 +
  145 +case "$1" in
  146 + start)
  147 + echo -n "Starting $DESC: "
  148 + normal_start
  149 + if running; then
  150 + echo "$NAME."
  151 + else
  152 + echo "ERROR."
  153 + fi
  154 + ;;
  155 + stop)
  156 + echo -n "Stopping $DESC: "
  157 + if normal_stop; then
  158 + echo "$NAME."
  159 + else
  160 + echo "ERROR."
  161 + fi
  162 + ;;
  163 + restart)
  164 + echo "Restarting $DESC..."
  165 + "$0" stop && "$0" start
  166 + ;;
  167 + force-stop)
  168 + echo -n "Forcefully stopping $DESC: "
  169 + force_stop
  170 + if running; then
  171 + echo "$NAME."
  172 + else
  173 + echo "ERROR."
  174 + fi
  175 + ;;
  176 + reload|force-reload)
  177 + #
  178 + # If the daemon can reload its config files on the fly
  179 + # for example by sending it SIGHUP, do it here.
  180 + #
  181 + # If the daemon responds to changes in its config file
  182 + # directly anyway, make this a do-nothing entry.
  183 + #
  184 + echo "Reloading $DESC: "
  185 + if ctl_reload; then
  186 + echo "$NAME."
  187 + else
  188 + echo "ERROR."
  189 + fi
  190 + ;;
  191 + #force-reload)
  192 + #
  193 + # If the "reload" option is implemented, move the "force-reload"
  194 + # option to the "reload" entry above. If not, "force-reload" is
  195 + # just the same as "restart" except that it does nothing if the
  196 + # daemon isn't already running.
  197 + # Check wether $DAEMON is running. If so, restart.
  198 + #echo "Not implemented."
  199 + #;;
  200 + status)
  201 + echo -n "$NAME is "
  202 + if running; then
  203 + echo "running"
  204 +# ctl_status
  205 + else
  206 + echo "not running."
  207 + exit 1
  208 + fi
  209 + ;;
  210 + *)
  211 + N=/etc/init.d/"$NAME"
  212 + echo "Usage: $N {start|stop|restart|reload|status|force-stop}" >&2
  213 + exit 1
  214 + ;;
  215 +esac
  216 +
  217 +exit 0
... ...
puppet/modules/supervisor/files/supervisord.conf 0 → 100644
... ... @@ -0,0 +1,139 @@
  1 +; Sample supervisor config file.
  2 +;
  3 +; For more information on the config file, please see:
  4 +; http://supervisord.org/configuration.html
  5 +;
  6 +; Note: shell expansion ("~" or "$HOME") is not supported. Environment
  7 +; variables can be expanded using this syntax: "%(ENV_HOME)s".
  8 +
  9 +[unix_http_server]
  10 +file=/tmp/supervisor.sock ; (the path to the socket file)
  11 +;chmod=0700 ; socket file mode (default 0700)
  12 +;chown=nobody:nogroup ; socket file uid:gid owner
  13 +;username=user ; (default is no username (open server))
  14 +;password=123 ; (default is no password (open server))
  15 +
  16 +;[inet_http_server] ; inet (TCP) server disabled by default
  17 +;port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface)
  18 +;username=user ; (default is no username (open server))
  19 +;password=123 ; (default is no password (open server))
  20 +
  21 +[supervisord]
  22 +logfile=/var/log/supervisord.log ; (main log file;default $CWD/supervisord.log)
  23 +logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
  24 +logfile_backups=10 ; (num of main logfile rotation backups;default 10)
  25 +loglevel=info ; (log level;default info; others: debug,warn,trace)
  26 +pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
  27 +nodaemon=false ; (start in foreground if true;default false)
  28 +minfds=1024 ; (min. avail startup file descriptors;default 1024)
  29 +minprocs=200 ; (min. avail process descriptors;default 200)
  30 +;umask=022 ; (process file creation umask;default 022)
  31 +;user=chrism ; (default is current user, required if root)
  32 +;identifier=supervisor ; (supervisord identifier, default is 'supervisor')
  33 +;directory=/tmp ; (default is not to cd during start)
  34 +;nocleanup=true ; (don't clean up tempfiles at start;default false)
  35 +;childlogdir=/tmp ; ('AUTO' child log dir, default $TEMP)
  36 +;environment=KEY="value" ; (key value pairs to add to environment)
  37 +;strip_ansi=false ; (strip ansi escape codes in logs; def. false)
  38 +
  39 +; the below section must remain in the config file for RPC
  40 +; (supervisorctl/web interface) to work, additional interfaces may be
  41 +; added by defining them in separate rpcinterface: sections
  42 +[rpcinterface:supervisor]
  43 +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
  44 +
  45 +[supervisorctl]
  46 +serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
  47 +;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
  48 +;username=chris ; should be same as http_username if set
  49 +;password=123 ; should be same as http_password if set
  50 +;prompt=mysupervisor ; cmd line prompt (default "supervisor")
  51 +;history_file=~/.sc_history ; use readline history if available
  52 +
  53 +; The below sample program section shows all possible program subsection values,
  54 +; create one or more 'real' program: sections to be able to control them under
  55 +; supervisor.
  56 +
  57 +;[program:theprogramname]
  58 +;command=/bin/cat ; the program (relative uses PATH, can take args)
  59 +;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
  60 +;numprocs=1 ; number of processes copies to start (def 1)
  61 +;directory=/tmp ; directory to cwd to before exec (def no cwd)
  62 +;umask=022 ; umask for process (default None)
  63 +;priority=999 ; the relative start priority (default 999)
  64 +;autostart=true ; start at supervisord start (default: true)
  65 +;autorestart=unexpected ; whether/when to restart (default: unexpected)
  66 +;startsecs=1 ; number of secs prog must stay running (def. 1)
  67 +;startretries=3 ; max # of serial start failures (default 3)
  68 +;exitcodes=0,2 ; 'expected' exit codes for process (default 0,2)
  69 +;stopsignal=QUIT ; signal used to kill process (default TERM)
  70 +;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
  71 +;stopasgroup=false ; send stop signal to the UNIX process group (default false)
  72 +;killasgroup=false ; SIGKILL the UNIX process group (def false)
  73 +;user=chrism ; setuid to this UNIX account to run the program
  74 +;redirect_stderr=true ; redirect proc stderr to stdout (default false)
  75 +;stdout_logfile=/a/path ; stdout log path, NONE for none; default AUTO
  76 +;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
  77 +;stdout_logfile_backups=10 ; # of stdout logfile backups (default 10)
  78 +;stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
  79 +;stdout_events_enabled=false ; emit events on stdout writes (default false)
  80 +;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO
  81 +;stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
  82 +;stderr_logfile_backups=10 ; # of stderr logfile backups (default 10)
  83 +;stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
  84 +;stderr_events_enabled=false ; emit events on stderr writes (default false)
  85 +;environment=A="1",B="2" ; process environment additions (def no adds)
  86 +;serverurl=AUTO ; override serverurl computation (childutils)
  87 +
  88 +; The below sample eventlistener section shows all possible
  89 +; eventlistener subsection values, create one or more 'real'
  90 +; eventlistener: sections to be able to handle event notifications
  91 +; sent by supervisor.
  92 +
  93 +;[eventlistener:theeventlistenername]
  94 +;command=/bin/eventlistener ; the program (relative uses PATH, can take args)
  95 +;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
  96 +;numprocs=1 ; number of processes copies to start (def 1)
  97 +;events=EVENT ; event notif. types to subscribe to (req'd)
  98 +;buffer_size=10 ; event buffer queue size (default 10)
  99 +;directory=/tmp ; directory to cwd to before exec (def no cwd)
  100 +;umask=022 ; umask for process (default None)
  101 +;priority=-1 ; the relative start priority (default -1)
  102 +;autostart=true ; start at supervisord start (default: true)
  103 +;autorestart=unexpected ; whether/when to restart (default: unexpected)
  104 +;startsecs=1 ; number of secs prog must stay running (def. 1)
  105 +;startretries=3 ; max # of serial start failures (default 3)
  106 +;exitcodes=0,2 ; 'expected' exit codes for process (default 0,2)
  107 +;stopsignal=QUIT ; signal used to kill process (default TERM)
  108 +;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
  109 +;stopasgroup=false ; send stop signal to the UNIX process group (default false)
  110 +;killasgroup=false ; SIGKILL the UNIX process group (def false)
  111 +;user=chrism ; setuid to this UNIX account to run the program
  112 +;redirect_stderr=true ; redirect proc stderr to stdout (default false)
  113 +;stdout_logfile=/a/path ; stdout log path, NONE for none; default AUTO
  114 +;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
  115 +;stdout_logfile_backups=10 ; # of stdout logfile backups (default 10)
  116 +;stdout_events_enabled=false ; emit events on stdout writes (default false)
  117 +;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO
  118 +;stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
  119 +;stderr_logfile_backups ; # of stderr logfile backups (default 10)
  120 +;stderr_events_enabled=false ; emit events on stderr writes (default false)
  121 +;environment=A="1",B="2" ; process environment additions
  122 +;serverurl=AUTO ; override serverurl computation (childutils)
  123 +
  124 +; The below sample group section shows all possible group values,
  125 +; create one or more 'real' group: sections to create "heterogeneous"
  126 +; process groups.
  127 +
  128 +;[group:thegroupname]
  129 +;programs=progname1,progname2 ; each refers to 'x' in [program:x] definitions
  130 +;priority=999 ; the relative start priority (default 999)
  131 +
  132 +; The [include] section can just contain the "files" setting. This
  133 +; setting can list multiple files (separated by whitespace or
  134 +; newlines). It can also contain wildcards. The filenames are
  135 +; interpreted as relative to this file. Included files *cannot*
  136 +; include files themselves.
  137 +
  138 +[include]
  139 +files = /etc/supervisor/conf.d/*.conf
... ...
puppet/modules/supervisor/manifests/app.pp 0 → 100644
... ... @@ -0,0 +1,31 @@
  1 +define supervisor::app (
  2 + $app_name = $title,
  3 + $command,
  4 + $directory,
  5 + $user = 'ubuntu',
  6 +) {
  7 +
  8 + $conf_file = "supervisor_${app_name}"
  9 + $service_name = $conf_file
  10 +
  11 + file { $conf_file:
  12 + path => "/etc/supervisor/conf.d/${app_name}.conf",
  13 + ensure => present,
  14 + content => template('supervisor/supervisor.conf.erb'),
  15 + require => Package['supervisor'],
  16 + notify => Service['supervisord'],
  17 + }
  18 +
  19 + service { $service_name:
  20 + ensure => running,
  21 + path => ['/usr/bin'],
  22 + start => "supervisorctl start $app_name",
  23 + restart => "supervisorctl restart $app_name",
  24 + stop => "supervisorctl stop $app_name",
  25 + status => "supervisorctl status | awk '/^${name}[: ]/{print \$2}' | grep '^RUNNING$'",
  26 + subscribe => File[$conf_file],
  27 + hasrestart => false,
  28 + hasstatus => false,
  29 + provider => base
  30 + }
  31 +}
... ...
puppet/modules/supervisor/manifests/init.pp 0 → 100644
... ... @@ -0,0 +1,40 @@
  1 +class supervisor {
  2 +
  3 + package { "supervisor":
  4 + ensure => installed,
  5 + provider => pip,
  6 + }
  7 +
  8 + service { "supervisord":
  9 + ensure => running,
  10 + enable => true,
  11 + require => [Package['supervisor'],
  12 + File['/etc/init.d/supervisord']],
  13 + stop => '/etc/init.d/supervisord stop',
  14 + start => '/etc/init.d/supervisord start',
  15 + restart => '/etc/init.d/supervisord restart',
  16 + subscribe => File['/etc/supervisord.conf'],
  17 + }
  18 +
  19 + file { '/etc/init.d/supervisord':
  20 + source => 'puppet:///modules/supervisor/debian-isnok',
  21 + mode => '0755',
  22 + }
  23 +
  24 + file { '/etc/supervisor':
  25 + ensure => directory,
  26 + }
  27 +
  28 + file { '/etc/supervisord.conf':
  29 + source => 'puppet:///modules/supervisor/supervisord.conf',
  30 + require => File['/etc/supervisor'],
  31 + }
  32 +
  33 + file { '/etc/supervisor/conf.d/':
  34 + ensure => directory,
  35 + recurse => true,
  36 + purge => true,
  37 + notify => Service['supervisord'],
  38 + require => File['/etc/supervisor'],
  39 + }
  40 +}
... ...
puppet/modules/supervisor/templates/supervisor.conf.erb 0 → 100644
... ... @@ -0,0 +1,7 @@
  1 +[program:<%= @app_name %>]
  2 +command=<%= @command %>
  3 +directory=<%= @directory %>
  4 +user=<%= @user %>
  5 +autostart=true
  6 +autorestart=true
  7 +redirect_stderr=True
... ...
puppet/modules/supervisor/tests/init.pp 0 → 100644
... ... @@ -0,0 +1,7 @@
  1 +
  2 +include supervisor
  3 +
  4 +supervisor::app { 'fake_service':
  5 + command => '/bin/cat',
  6 + directory => '/tmp/',
  7 +}
... ...