Как убедиться, что сервис работает, используя Chef?

10

Я нахожусь в ситуации, когда Chef может запустить службу (postgres), но впоследствии она может быть остановлена ​​вне группы. Я хочу, чтобы при последующем запуске Chef служба работала. Я пробовал это:

service "postgresql" do
    action :start
end

Но это не имеет никакого эффекта, говоря, по- (up to date)видимому, потому что Шеф знает, что он был запущен, и не может сказать, что он остановился. (Возможно, из-за того, как service ... statusведет себя этот сервис?) Если я напишу это:

# anti-pattern warning!
execute "force-start-postgresql" do
  command "service postgresql start || /etc/init.d/postgresql start"
  action :run
end

Я получаю желаемое поведение. Кроме того, action :restartделает это работает. Однако они кажутся анти-паттернами из-за переносимости (и, возможно, остановки перед последующим запуском в последнем случае).

Итак, как я могу сказать Chef принудительно запустить службу, даже если он думает, что она уже запущена?

Это использует Chef 11.6, размещенный в OpsCode, и рецепт postgresql по умолчанию. (Обратите внимание, что это похоже, но я думаю, что это не то же самое, что « Как заставить действия на« современных »ресурсах в Chef?» .)

--- РЕДАКТИРОВАТЬ (уточнение после публикации в jtimberland) ---

В -l debugздесь показано:

DEBUG: service[postgresql] supports status, running
DEBUG: service[postgresql] is running

Даже когда он НЕ работает. Это звучит как одна ошибка, и я заинтересован в этом. Однако меня в первую очередь интересует, есть ли способ сказать Chef «всегда вызывать команду запуска службы, пропуская проверку статуса». Это вопрос здесь.

(Я не эксперт, но я думаю, что самый портативный способ убедиться, что служба запущена, - это запустить службу, и это почти всегда идемпотент. OTOH проверка, работает ли служба, менее последовательна, и я не понимаю, почему мы должны заботиться !)

Частично облачно
источник

Ответы:

11

По умолчанию Chef проверяет, работает ли служба, и запускает ее, если служба не запущена.

Как он определяет, что служба работает, зависит.

По умолчанию Chef пытается сопоставить имя службы ( postgresqlздесь) в таблице процессов, используя ps.

ps -ef | grep postgresql

По существу. Имя службы будет использоваться для сопоставления с образцом при проверке таблицы процесса. Это может или не может быть тем, что вы хотите / нужно, особенно в зависимости от платформы и того, как она называет службу "postgresql".

Однако вы можете сказать Chef, что служба поддерживает команду «status», что означает, что Chef обычно делает что-то вроде:

/etc/init.d/postgresql status

И используйте код возврата, чтобы определить, работает он или нет (не ноль не работает).

Chef не делает этого по умолчанию, потому что не все служебные сценарии поддерживают команду состояния (разочаровывающе), и Chef изначально не знает, что нужно делать. Он пытается сделать нормальную вещь по умолчанию, но иногда наивен. Таким образом, вы можете сказать Chef, что ресурс имеет команду состояния и не быть таким наивным.

service "postgresql" do
  supports :status => true
  action :start
end

Теперь, если сервис на самом деле не называется «postgresql», а вместо этого «postgresql-92» или похожим, вы можете сделать это следующим образом:

service "postgresql-92" do
  supports :status => true
  action :start
end

или

service "postgresql" do
  service_name "postgresql-92"
  supports :status => true
  action :start
end

Вы можете узнать, что происходит более подробно, запустив команду chef с выводом отладки:

chef-client -l debug
jtimberman
источник
Это полезно, но не совсем отвечает на вопрос. Я хочу сказать это :start независимо от :status. Также я надеюсь, что он делает ps -ef | grep [p]ostgresqlили похожий, иначе он обычно будет соответствовать своей собственной команде grep и, таким образом, всегда будет думать, что служба работает. (Или, может быть, в этом основная проблема?)
Небольшая
Мне кажется, что в Chef есть ошибка или что-то не так в системе. На какой платформе / platform_version вы работаете? Как вы установили postgresql? Пакет, источник?
Jtimberman
К тому же Chef предпринимает идемпотентные действия для управления ресурсами, которые определены декларативным способом. Способ, которым вы гарантируете, что служба работает с Chef, состоит в том, чтобы отправить действие запуска в службу. Если этого не происходит, это ошибка в Chef, ошибка в рецепте или ошибка в системе.
jtimberman
Спасибо @jtimberman. Я открыл ошибку из-за неверного статуса, который был возвращен на tickets.opscode.com/browse/COOK-334 . Однако мой вопрос здесь заключается в том, существует ли способ заставить chef выдать команду service-start, пропуская проверку статуса. service startпочти всегда идемпотент, так что это должно быть хорошо.
Небольшая
К сожалению, ошибка является tickets.opscode.com/browse/COOK-3526 .
Небольшая