Chef: buat direktori untuk templat jika belum ada

16

Jika saya memiliki template yang dibuat, bagaimana saya bisa memastikan bahwa direktori itu ada? Contohnya:

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

Ini gagal karena /var/www/example/shared/configtidak ada untuk database.ymldisalin. Saya sedang memikirkan bagaimana boneka memungkinkan Anda untuk "memastikan" ada direktori.

Matius
sumber

Jawaban:

18

Gunakan sumber daya direktori untuk membuat direktori sebelum membuat templat. Caranya adalah dengan juga menentukan recursiveatribut jika tidak tindakan akan gagal kecuali semua bagian direktori tetapi yang terakhir sudah ada.

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

Perhatikan bahwa ownerdan groupdari sumber daya direktori hanya diterapkan ke direktori daun ketika sedang dibuat. Izin dari seluruh direktori tidak ditentukan, tetapi mungkin akan menjadi root.root dan apa pun umask Anda.

Tim Potter
sumber
Itu sebabnya saya tidak suka recursiveopsi ;-)
StephenKing
Ya saya juga. Hanya saja rasanya tidak terlalu Chef-y harus menentukan setiap level atau membiarkannya secara default.
Tim Potter
tautan rusak tautan baru untuk sumber daya direktori adalah docs.chef.io/resource_directory.html
Brick
4

Saya tidak mengetahui cara lain selain menggunakan directorysumber daya sebelum templatesumber daya:

directory "#{node[:app][:deploy_to]}/#{node[:app][:name]}/shared/config/
  owner node[:user][:username]
  group node[:user][:username]
end
Stephen King
sumber