Я использую Debian Squeeze с PostgreSQL 9.1 из backports. Puppet имеет версию 2.7.14. К сожалению, скрипт инициализации возвращает неправильный код выхода для статуса. Поэтому я написал пользовательскую status
команду, чтобы определить, работает ли postgresql или нет.
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,
}
Моя команда работает как шарм, но у марионетки, похоже, есть проблема. Я всегда получаю, notice: /Stage[main]/Postgresql/Service[postgresql]/ensure: ensure changed 'stopped' to 'running'
хотя это уже работает.
Итак, попробовал следующее:
service { 'postgresql':
ensure => running,
enable => true,
hasstatus => false,
hasrestart => true,
status => "exit 0",
provider => debian,
}
Как я понял из этой пользовательской status
команды, puppet всегда должен думать, что postgresql запущен. Тем не менее марионетка пытается запустить postgresql - каждый раз.
В чем я виновата? Или это ошибка в марионетке?
provider => init
(и удалитьenable
параметр).status
команда puppet работает как положено!Ответы:
Я думаю, что
$4
ваша команда поглощается собственной интерполяцией puppet, иexit 0
это не совсем правильно из-за проблем взаимодействия с оболочкой.Я бы попробовал несколько вещей.
$4
в вашей команде включена интерполяция марионетки, используйте следующую команду$
:status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"
(иногда требуется дополнительная обратная косая черта, но я уверен, что здесь достаточно 1).exit
это внутренняя оболочка, и я не уверен, как кукла будет относиться к этому. Так что используйте вместо этого каноническую команду «вернуть успех»:status => "/bin/true"
Возможно
status
, переопределяетсяprovider => debian
(что было бы ошибкой марионетки), поэтому вместо этого укажите все команды и используйте базовый провайдер (однако, он не включится должным образом):источник
exec
тип, я думаю, что puppet нужны полные пути к исполняемым файлам. Попробуйте установить их для полного пути в вашейstatus
строке, если вы не задали его глобально?exec
Принимаетpath
параметр, и вы можете установить путь по умолчанию с помощьюExec { path => '/usr/bin:/bin' }
илиExec { path => ['/usr/bin'],['/bin']}
. В Service есть аналогичный «путь», но, похоже, он в основном используется с определенными провайдерами для поиска сценариев инициализации, а не в качестве обычного пути поиска команд в стиле оболочки.$4
была проблемой. Я заменил его,\$4
и теперь все работает, как ожидалось :)