Я использую 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 запущен. Тем не менее puppet пытается запустить postgresql - каждый раз.
В чем я виновата? Или это баг в марионетке?
Мои лучшие догадки заключаются в том, что $4
в вашей команде поглощается собственной интерполяцией марионетки, и это exit 0
не работает должным образом из-за проблем с взаимодействием с оболочкой.
Я бы попробовал несколько вещей.
$4
в вашей команде избежать $
вот так: status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"
(иногда требуется больше обратных косых черт, но я уверен, что одного здесь достаточно).exit
- это внутренняя оболочка, и я не уверен, как марионетка будет относиться к этому. Поэтому используйте вместо этого каноническую команду "return success": status => "/bin/true"
Может быть status
отменяется provider => debian
(что было бы марионеточной ошибкой), поэтому вместо этого укажите все команды и используйте базовый поставщик (однако это не будет работать должным образом):
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 }'",
}