Назад | Перейти на главную страницу

Как использовать настраиваемую команду статуса для службы в марионетке?

Я использую 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 не работает должным образом из-за проблем с взаимодействием с оболочкой.

Я бы попробовал несколько вещей.

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