Chef: crie um diretório para um modelo se ele ainda não existir

15

Se eu tenho um modelo sendo criado, como posso garantir que o diretório exista? Por exemplo:

template "#{node[:app][:deploy_to]}/#{node[:app][:name]}/shared/config/database.yml" do
  source 'database.yml.erb'
  owner node[:user][:username]
  group node[:user][:username]
  mode 0644
  variables({
    :environment => node[:app][:environment],
    :adapter => node[:database][:adapter],
    :database => node[:database][:name],
    :username => node[:database][:username],
    :password => node[:database][:password],
    :host => node[:database][:host]
  })
end

Isso falha, pois /var/www/example/shared/config não existe para que database.yml seja copiado. Estou pensando em como o fantoche permite "garantir" a existência de um diretório.

    
por Matthew 12.03.2013 / 04:02

2 respostas

16

Use o recurso de diretório para criar o diretório antes de criar o modelo. O truque é também especificar o atributo recursive , caso contrário, a ação falhará, a menos que todas as partes do diretório, mas a última, já existam.

config_dir = "#{node[:app][:deploy_to]}/#{node[:app][:name]}/shared/config"

directory config_dir do
  owner node[:user][:username]
  group node[:user][:username]
  recursive true
end

template "#{config_dir}/database.yml" do
  source "database.yml.erb"
  ...
end

Observe que owner e group do recurso de diretório são aplicados apenas ao diretório leaf quando ele está sendo criado. As permissões do resto do diretório são indefinidas, mas provavelmente serão root.root e qualquer que seja sua umask.

    
por 12.03.2013 / 19:35
4

Não estou ciente de nenhuma outra maneira de usar o recurso directory antes do recurso template :

directory "#{node[:app][:deploy_to]}/#{node[:app][:name]}/shared/config/
  owner node[:user][:username]
  group node[:user][:username]
end
    
por 12.03.2013 / 09:45