How to use a custom status command for a service in puppet?
My best guesses are that the $4
in your command is getting swallowed up by puppet's own interpolation and that exit 0
doesn't quite work right due to shell interaction issues.
I would try a few things.
- If the problem is puppet's interpolation on
$4
in your command escape the$
like so:status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"
(sometimes more backslashes are required, but I'm pretty sure 1 is enough here). - Make sure the test command is really working right.
exit
is a shell internal and I'm not sure how puppet will treat that. So use the canonical "return success" command instead:status => "/bin/true"
Maybe
status
is being overridden byprovider => debian
(which would be a puppet bug), so instead specify all the commands and use the base provider (this won't enable properly, however):service { 'postgresql': provider => base, ensure => 'running', start => '/etc/init.d/postgresql start', restart => '/etc/init.d/postgresql restart', stop => '/etc/init.d/postgresql stop', status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'", }
MMore
Updated on September 18, 2022Comments
-
MMore over 1 year
I am using debian squeeze with PostgreSQL 9.1 from backports. Puppet has version 2.7.14. Unfortunatly the init script returns the wrong exit code for status. Therefore I wrote a custom
status
command to detect whether postgresql is running or not.service { 'postgresql': ensure => running, enable => true, hasstatus => false, hasrestart => true, status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if ($4 != \"online\") rc=3} END { exit rc }'", provider => debian, }
My command works like a charme, but puppet seems to have a problem. I always get
notice: /Stage[main]/Postgresql/Service[postgresql]/ensure: ensure changed 'stopped' to 'running'
although it is already running.So tried the following:
service { 'postgresql': ensure => running, enable => true, hasstatus => false, hasrestart => true, status => "exit 0", provider => debian, }
As I understood this custom
status
command, puppet should always think that postgresql is running. Nevertheless puppet tries to start postgresql - every time.What is my fault? Or is it a bug in puppet?
-
Admin about 12 yearsYour manifest looks correct, so this sounds like a bug in Puppet. It's a long shot, but try setting
provider => init
(and remove theenable
parameter). -
Admin about 12 years@Zoredache you are right. With sh -c 'exit 0' the
status
command of puppet works as expected!
-
-
ravi yarlagadda about 12 yearsOne other thing: similar to the
exec
type, I think puppet needs full paths to executables. Try setting those to the full path in yourstatus
line, if you haven't set one globally? -
cpl593x about 12 years@ShaneMadden: Puppet doesn't necessarily need full paths to commands, though assuming it needs them doesn't hurt anything. In addition to a some sort of default path (PATH in environment daemon was started in?)
exec
accepts apath
param and you can set a default path withExec { path => '/usr/bin:/bin' }
orExec { path => ['/usr/bin'],['/bin']}
. There's a similar 'path' on Service, but it appears to be primarily used with certain providers for finding init scripts, rather than as a normal shell-style command search path. -
MMore about 12 yearsThanks! The interpolation of
$4
was the problem. I replaced it with\$4
and now everything works as expected :)