Шеф-кухар: створити каталог для шаблону, якщо він ще не існує


17

Якщо у мене створюється шаблон, як я можу переконатися, що каталог існує? Наприклад:

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

Це не вдається, оскільки /var/www/example/shared/configне існує для database.ymlкопіювання. Я думаю про те, як маріонетка дозволяє "забезпечити" існування каталогу.

Відповіді:


19

Використовуйте ресурс каталогу для створення каталогу перед створенням шаблону. Трюк полягає в тому, щоб також вказати recursiveатрибут, інакше дія не вдасться, якщо всі частини каталогу, але остання, вже існують.

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

Зауважте, що ресурс каталогів ownerта groupкаталогів застосовуються до каталогу листів лише під час його створення. Дозвілля решти каталогу не визначено, але, ймовірно, буде root.root і будь-який ваш umask.


Тому мені не подобається recursiveваріант ;-)
StephenKing

Так я також. Просто шеф-кухаря не відчуває себе або потрібно вказувати кожен рівень або залишати все це за замовчуванням.
Тім Поттер

посилання зламано нове посилання на ресурс каталогів - це docs.chef.io/resource_directory.html
Цегла з

4

Я не знаю іншого способу, як використовувати directoryресурс перед templateресурсом:

directory "#{node[:app][:deploy_to]}/#{node[:app][:name]}/shared/config/
  owner node[:user][:username]
  group node[:user][:username]
end
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.