Evitar que a receita do chef execute a ação executada anteriormente?

3

Eu tenho uma receita simples como esta e atualmente estou usando um arquivo local para indicar se o comando foi executado ou não

execute "test" do
  command "sh test.sh && touch /opt/myapp/done.log"
  only_if {File.exists?("/opt/myapp/done.log")}
end

Existem métodos melhores? É o caminho recomendado?

    
por Ryan 11.03.2013 / 15:14

2 respostas

1

Este é geralmente o método que eu uso, especialmente se o comando que você executar resultar em um arquivo sendo criado como um efeito colateral. Por exemplo, desabilitar ou habilitar sites no pacote apache2 do Debian remove ou cria links em /etc/apache2 que você pode testar usando File.exists? .

Um truque é definir um atributo após a execução do recurso de execução:

if !node["did_test"]
  execute "test" do
    command "touch /tmp/foo"
  end
end

ruby_block "did_test" do
  block do
    node.normal["did_test"] = true
  end
end

Observe que ainda é possível que o recurso de execução seja executado duas vezes em algumas situações, portanto, essa técnica não é perfeita, mas agora você pode usar a pesquisa de faca para determinar quais nós realizaram a execução.

    
por 11.03.2013 / 19:35
3

Existem algumas maneiras de manter execute executando várias vezes no nó:

  • Usando not_if , only_if declarações.
  • Usando action :nothing e, em seguida, notificando esse recurso execute para executar a partir de outro recurso. (somente se você precisar executá-lo toda vez que o primeiro recurso for alterado)
  • Usando creates [some/file] (o Chef executará, somente se o arquivo não existir, equivalente a not_if { ::File.exists? '[some/file]' }

Se você não puder determinar facilmente, se o seu script foi executado sem criar um arquivo adicional, então é o único caminho. Então você, na verdade, está fazendo tudo certo.

Exceto que o código que você forneceu será realmente executado, se o arquivo existir . Mas suponho que seja um erro de digitação.

    
por 22.03.2013 / 22:09