Марионетка ждет, пока услуга будет готова

Я использую Puppet для подготовки компьютеров. У меня есть служба, работающая на сервере приложений Tomcat 6, и другой манифест, зависящий от этой службы (отправка некоторых запросов REST как часть установки). Проблема в том, что служба недоступна сразу после запуска tomcat с помощью:

service {"tomcat6":
  ensure  => running, enable => true, hasstatus => true, hasrestart => true;
}

Поэтому мне нужно какое-то условие для другого манифеста, которое гарантировало бы, что служба действительно работает (например, проверка доступности некоторого URL-адреса). А если он еще не готов, подождите некоторое время и повторите попытку с некоторым ограничением на количество повторных попыток.

Есть ли какое-то идиоматическое решение Puppet или какое-то другое, которое могло бы достичь этого?

Примечание: сон не является решением.


person iNecas    schedule 23.11.2011    source источник


Ответы (3)


Спасибо lzap и людям из irc-канала Puppet, вот решение:

exec {"wait for tomcat":
  require => Service["tomcat6"],
  command => "/usr/bin/wget --spider --tries 10 --retry-connrefused --no-check-certificate https://localhost:8443/service/",
}

При использовании require => Exec["wait for tomcat"] в зависимом манифесте он не будет работать, пока служба не будет действительно готова.

person iNecas    schedule 23.11.2011
comment
Хороший. Был так сосредоточен на решении bash. Таким образом, он возвращает ноль, когда tomcat поднимается, и ненулевое значение, когда он терпит неудачу 10 раз. Прохладный. - person lzap; 24.11.2011

Не марионетка, а оболочка...

max=30; while ! wget --spider http://localhost:8080/APP > /dev/null 2>&1; do
  max=$(( max - 1 )); [ $max -lt 0 ] && break; sleep 1
done; [ $max -gt 0 ]

Это улучшенная версия.

Он возвращает true, когда приложение найдено, и false, когда достигнуто максимальное значение.

person lzap    schedule 23.11.2011
comment
к сожалению, max нельзя использовать таким образом в качестве команды Puppet (Puppet жалуется), к счастью, wget может повторить попытку автоматически (см. мой ответ) - person iNecas; 23.11.2011

Я знаю, что это не Марионетка, но:

max=30; e=1; while [ $e -ne 0 -a $max -gt 0 ]; do
  wget --spider http://localhost:8080/APP > /dev/null 2>&1
  e=$?; max=$(( max - 1 )); sleep 1
done; [ $max -ne 0 ]

Вы можете поместить его в одну строку, просто соединив его точкой с запятой (кроме оператора «do»).

person lzap    schedule 23.11.2011