Estou em uma situação em que o Chef pode iniciar um serviço (postgres), mas pode ser interrompido posteriormente fora da banda. Quero que um Chef subseqüente seja executado para que o serviço seja executado. Eu tentei isso:
service "postgresql" do
action :start
end
Mas não tem efeito, dizendo (up to date)
presumivelmente porque o Chef sabe que foi iniciado e não é capaz de dizer que parou. (Possivelmente devido a como service ... status
se comporta para este serviço?) Se eu escrever isso:
# anti-pattern warning!
execute "force-start-postgresql" do
command "service postgresql start || /etc/init.d/postgresql start"
action :run
end
Eu recebo o comportamento desejado. Também action :restart
faz funcionar. No entanto, estes parecem antipadrões devido à portabilidade (e potencialmente pará-lo antes de iniciá-lo novamente no último caso).
Então, como posso dizer ao Chef para iniciar à força o serviço, mesmo que ele ache que já está em execução?
Isso está usando o Chef 11.6, hospedado pelo OpsCode, e a receita padrão do postgresql. (Observe que isso é semelhante, mas acho que não é o mesmo que Como forçar ações em recursos "atualizados" no Chef?. )
--- EDIT (esclarecimento após publicação no jtimberland) ---
O -l debug
aqui mostra:
DEBUG: service[postgresql] supports status, running
DEBUG: service[postgresql] is running
Mesmo quando não está em execução. Então isso soa como um bug, e eu estou interessado nisso. No entanto, estou principalmente interessado em saber se há uma maneira de informar ao Chef "sempre invoque o comando service start, ignorando a verificação de status". Essa é a questão aqui.
(Não sou especialista, mas acho que a maneira mais portátil de garantir a execução de um serviço é iniciá-lo e isso quase sempre é idempotente. OTOH verificar se um serviço está em execução é menos consistente e não vejo por que devemos nos importar !)
:start
independentemente da:status
. Também espero que faça umps -ef | grep [p]ostgresql
ou semelhante, caso contrário, ele geralmente corresponderá ao seu próprio comando grep e, portanto, sempre achará que o serviço está sendo executado. (Ou talvez esse é o problema subjacente?)