Я нахожусь в ситуации, когда Chef может запустить службу (postgres), но впоследствии она может быть остановлена вне диапазона. Я хочу, чтобы следующий запуск Chef запустил службу. Я пробовал это:
service "postgresql" do
action :start
end
Но это не действует, говоря (up to date)
предположительно потому, что Chef знает, что он был запущен, и не может сказать, что он остановился. (Возможно, из-за того, как 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 проверка работает ли служба менее согласованно, и я не понимаю, почему нам это должно быть важно!)
По умолчанию 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