Як використовувати користувальницьку команду статусу для послуги в ляльці?


10

Я використовую стиснення Debian з PostgreSQL 9.1 з заднього списку. Лялька має версію 2.7.14. На жаль, скрипт init повертає неправильний код виходу для статусу. Тому я написав спеціальну 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команду, лялечка завжди повинна думати, що виконується postgresql. Тим не менш, лялька намагається почати postgresql - кожен раз.

У чому я винен? Або це клоп у ляльці?


Ваш маніфест виглядає правильно, тому це звучить як помилка у Лялькові. Це довгий знімок, але спробуйте встановити provider => init(і видаліть enableпараметр).
mgorven

2
Ви впевнені, що вихід 0 - це дійсна команда? Команда виходу зазвичай є внутрішньою оболонкою. Вам потрібно зробити щось на кшталт bash -c 'exit 0'?
Зоредаче

@Zoredache ви праві. З sh -c 'вихід 0' statusкоманда лялькових працює як очікується!
MMore

Відповіді:


6

Мої найкращі здогадки - це те, що $4у вашій команді поглинається власна інтерполяція ляльок, і 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 }'",
    }
    

Ще одне: схоже на execтип, я думаю, що лялькові потрібні повні шляхи до виконавчих файлів. Спробуйте встановити їх на повний шлях у statusрядку, якщо ви його не встановили в усьому світі?
Шейн Мадден

@ShaneMadden: Маріонетка не обов'язково потребує повних шляхів до команд, хоча припускаючи, що вона їм потрібна, це нічого не шкодить. На додаток до якогось шляху за замовчуванням (PATH в демон-середовищі було запущено?) execПриймає pathпарам і ви можете встановити шлях за замовчуванням за допомогою Exec { path => '/usr/bin:/bin' }або Exec { path => ['/usr/bin'],['/bin']}. У службі є подібний "шлях", але він, як видається, використовується в основному з певними провайдерами для пошуку сценаріїв init, а не як звичайний шлях пошуку в командному стилі.
freiheit

1
Дякую! Проблема $4була в інтерполяції Росії . Я замінив його \$4і зараз все працює так, як очікувалося :)
MMore
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.