Você definitivamente deve usar um metaparameter not_if ou only_if para o recurso de script, caso contrário, o Chef executará o script sempre que for executado no nó. Dependendo do software que você está compilando, isso pode ser tão simples quanto a existência do arquivo, ou que é um tamanho diferente de zero, ou tão complexo quanto verificar se o comando copiado em / usr / local / bin produz alguma string em particular .
Por exemplo, se você quiser ver se o arquivo simplesmente existe e assumir o melhor:
script "install_foo" do
# .. other stuff you wrote!
not_if "test -x /usr/local/bin/foo"
end
Você provavelmente deve ter certeza de que o arquivo é executável, já que você o coloca em / usr / local / bin.
file "/usr/local/bin/foo" do
mode 0755
end
Se você quiser verificar se o comando tem alguma saída específica, você pode fazer algo como:
script "install_foo" do
# .. other stuff you wrote!
not_if "test -x /usr/local/bin/foo && /usr/local/bin/foo | grep -x 'foo is awesome'"
end
(assumindo que executar o foo teria essa saída, é claro).
Os metapâmetros not_if (e only_if) podem receber uma string ou um bloco Ruby. Se for uma string, então serão comandos shell executados no sistema. Se for um bloco Ruby (do .. end ou {}), então ele será executado como Ruby.
Meta-parâmetros são documentados no wiki do Chef sob a página "recursos" .