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

10

Я использую 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 - каждый раз.

В чем я виновата? Или это ошибка в марионетке?

MMore
источник
Ваш манифест выглядит правильно, так что это звучит как ошибка в Puppet. Это длинный выстрел, но попробуйте установить provider => init(и удалить enableпараметр).
mgorven
2
Вы уверены, что выход 0 является допустимой командой? Команда выхода обычно является внутренней для оболочки. Вам нужно сделать что-то вроде bash -c 'exit 0'?
Zoredache
@Zoredache ты прав. С sh -c 'exit 0' statusкоманда puppet работает как положено!
Более

Ответы:

6

Я думаю, что $4ваша команда поглощается собственной интерполяцией puppet, и exit 0это не совсем правильно из-за проблем взаимодействия с оболочкой.

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

  1. Если проблема заключается в том, что $4в вашей команде включена интерполяция марионетки, используйте следующую команду $: status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"(иногда требуется дополнительная обратная косая черта, но я уверен, что здесь достаточно 1).
  2. Убедитесь, что тестовая команда действительно работает правильно. exitэто внутренняя оболочка, и я не уверен, как кукла будет относиться к этому. Так что используйте вместо этого каноническую команду «вернуть успех»: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 }'",
    }
    
Freiheit
источник
Еще одна вещь: похоже на execтип, я думаю, что puppet нужны полные пути к исполняемым файлам. Попробуйте установить их для полного пути в вашей statusстроке, если вы не задали его глобально?
Шейн Мэдден
@ShaneMadden: Puppet не обязательно нужны полные пути к командам, хотя при условии, что они нужны, ничего не повредит. В дополнение к некоторому пути по умолчанию (PATH в демоне среды, в котором был запущен?) execПринимает pathпараметр, и вы можете установить путь по умолчанию с помощью Exec { path => '/usr/bin:/bin' }или Exec { path => ['/usr/bin'],['/bin']}. В Service есть аналогичный «путь», но, похоже, он в основном используется с определенными провайдерами для поиска сценариев инициализации, а не в качестве обычного пути поиска команд в стиле оболочки.
Freiheit
1
Спасибо! Интерполяция $4была проблемой. Я заменил его, \$4и теперь все работает, как ожидалось :)
MMore