Como garantir que um serviço está sendo executado usando o Chef?

9

Estou em uma situação em que o Chef pode iniciar um serviço (postgres), mas pode ser interrompido posteriormente fora da banda. Eu quero um Chef subsequente executado para fazer com 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 obtenho o comportamento desejado. Além disso, um action :restart faz com que ele seja executado. No entanto, estes parecem anti-padrões devido à portabilidade (e potencialmente pará-lo antes de iniciá-lo novamente no último caso).

Então, como posso dizer ao Chef para forçar o início do serviço, mesmo que ele ache que já está em execução?

Isso é usando o Chef 11.6, hospedado pelo OpsCode, e a receita postgresql padrão. (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 postagem do 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 existe uma maneira de dizer ao Chef "sempre invocar o comando start service, pulando a verificação de status". Essa é a questão aqui.

(Não sou especialista, mas acho que a forma mais portátil de garantir que um serviço está em execução é iniciar o serviço e quase sempre é idempotente. OTOH verificar se um serviço está em execução é menos consistente e não vejo por que devemos nos importar!)

    
por Partly Cloudy 28.08.2013 / 16:00

1 resposta

11

Por padrão, o Chef verificará se o serviço está sendo executado e o iniciará se o serviço não estiver em execução.

Como isso determina que o serviço está sendo executado depende.

Por padrão, o Chef tentará corresponder o nome do serviço ( postgresql here) na tabela de processos usando ps .

ps -ef | grep postgresql

Essencialmente. O nome do serviço será usado para a correspondência de padrões ao inspecionar a tabela de processos. Isso pode ou não ser o que você quer / precisa, especialmente dependendo da plataforma e como ele nomeia o serviço "postgresql".

No entanto, você pode dizer ao Chef que o serviço suporta um comando "status", o que significa que o Chef geralmente fará algo como

/etc/init.d/postgresql status

E use o código de retorno para determinar se ele está sendo executado ou não (não-zero não está em execução).

O Chef não faz isso por padrão, porque nem todos os scripts de serviço suportam um comando de status (de maneira frustrante), e o Chef não sabe, por natureza, qual é a coisa certa a fazer. Ele tenta fazer a coisa padrão, mas às vezes ingênua. Assim, você pode dizer ao Chef que o recurso tem um comando de status e não é tão ingênuo.

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

Agora, se o serviço não tiver o nome "postgresql", mas sim "postgresql-92" ou similar, você poderá fazer isso como:

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

ou

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

Você pode descobrir o que está acontecendo com mais detalhes, executando o chef com a saída de depuração, também:

chef-client -l debug
    
por 28.08.2013 / 22:09