Commit 29840f404cbb15f78ea1a5aa86e439d72c1aaffb
1 parent
7e5efbca
Exists in
master
and in
39 other branches
Adding supervisor module
Showing
7 changed files
with
465 additions
and
0 deletions
Show diff stats
| ... | ... | @@ -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 | ... | ... |
| ... | ... | @@ -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 | ... | ... |
| ... | ... | @@ -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 | ... | ... |
| ... | ... | @@ -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 | +} | ... | ... |
| ... | ... | @@ -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 | +} | ... | ... |