Maneira mais fácil de aplicar uma condição a um conjunto de recursos do Chef

2

Nesta parte de uma receita do Chef, existem 4% de recursosexecute. Eles só devem ser executados quando um arquivo não existir. Isso é adicionado como uma condição para o primeiro recurso, que então aciona toda a cadeia a ser executada.

# Set up default SSL cert
execute "defaultcert1" do
    not_if {File.exist?("/vol/webserver/cert")}
    command "mkdir /vol/webserver/cert"
    notifies :run, "execute[defaultcert2]", :immediately
end
execute "defaultcert2" do
    action :nothing
    command "ln -s /etc/ssl/certs/ssl-cert-snakeoil.pem /vol/webserver/cert/server.crt"
    notifies :run, "execute[defaultcert3]", :immediately
end
execute "defaultcert3" do
    action :nothing
    command "ln -s /etc/ssl/private/ssl-cert-snakeoil.key /vol/webserver/cert/server.key"
    notifies :run, "execute[defaultcert4]", :immediately
end
execute "defaultcert4" do
    action :nothing
    command "chown -R ubuntu:ubuntu /vol/webserver/cert"
end

Como você pode ver, é um grande código para guardar apenas 4 comandos. Existe uma maneira melhor de fazer isso?

    
por Bart van Heukelom 25.07.2013 / 13:45

1 resposta

2

Para o seu exemplo específico, sugiro usar o directory e link recursos, de preferência a descartar:

directory "/vol/webserver/cert" do
    user "ubuntu"
    group "ubuntu"
end

link "/vol/webserver/cert/server.crt" do
    to "/etc/ssl/certs/ssl-cert-snakeoil.pem"
end
link "/vol/webserver/cert/server.key" do
    to "/etc/ssl/certs/ssl-cert-snakeoil.key"
end

Você não precisa guardá-los com not_if e notificar - se o diretório e os links já existirem com os atributos corretos, o Chef não fará nada.

Por outro lado, digamos que você queira usar o certificado e a chave snakeoil se nada estiver lá para começar, mas não faça nada se os arquivos já existirem. Nesse caso, eu usaria not_if nos recursos do link:

directory "/vol/webserver/cert" do
    user "ubuntu"
    group "ubuntu"
end

link "/vol/webserver/cert/server.crt" do
    to "/etc/ssl/certs/ssl-cert-snakeoil.pem"
    not_if "test -e /vol/webserver/cert/server.crt"
end

link "/vol/webserver/cert/server.key" do
    to "/etc/ssl/certs/ssl-cert-snakeoil.key"
    not_if "test -e /vol/webserver/cert/server.key"
end

Comparado a uma sequência de recursos execute , isso comunica a intenção com mais clareza - diz que um diretório precisa existir (com o usuário e grupo corretos) e que alguns links simbólicos devem ser criados a menos que algo já esteja presente .

Por fim, se você tiver vários comandos de shell relacionados que precisam ser executados juntos, considere o uso do recurso script .

    
por 25.07.2013 / 23:57

Tags