Кукольный ждет службы, чтобы быть готовым - PullRequest
7 голосов
/ 23 ноября 2011

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

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

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

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

Примечание - сон не является решением проблемы.

Ответы [ 3 ]

18 голосов
/ 23 ноября 2011

Благодаря lzap и людям в канале Puppet irc вот решение:

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"] в зависимом манифесте, он не будет работать до тех пор, покасервис действительно готов.

1 голос
/ 23 ноября 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 ]

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

Возвращает истину, когда приложение было найдено, ложь, когда достигнут максимум.

0 голосов
/ 23 ноября 2011

Я знаю, что это не Puppet, но:

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").

...