Chef: создайте каталог для шаблона, если он еще не существует

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копирования в. Я думаю о том, как puppet позволяет «гарантировать», что каталог существует.

Мэтью
источник

Ответы:

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 и все, что у вас есть.

Тим Поттер
источник
Вот почему мне не нравится этот recursiveвариант ;-)
StephenKing
Да, я тоже. Он просто не чувствует себя достаточно Chef-y, когда приходится указывать каждый уровень или оставлять все по умолчанию.
Тим Поттер
ссылка сломана новая ссылка для ресурса каталога - это 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
Стивен Кинг
источник