web-dev-qa-db-fra.com

Chef: Créez un répertoire pour un modèle si cela n'existe pas déjà

Si j'ai créé un modèle, comment puis-je vous assurer que le répertoire existe? Par exemple:

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

Cela échoue depuis /var/www/example/shared/config n'existe pas pour database.yml à copier dans. Je pense comment la marionnette vous permet de "assurer" un répertoire existant.

17
Matthew

Utilisez la Ressource de répertoire pour créer le répertoire avant de créer le modèle. L'astuce consiste également à spécifier l'attribut recursive, sinon l'action échouera à moins que toutes les parties du répertoire, mais elles existent déjà.

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

Notez que le owner et group de la ressource de répertoire ne sont appliqués que sur le répertoire des feuilles lors de sa création. Les autorisations du reste du répertoire sont indéfinies, mais seront probablement root.root et quel que soit votre monask.

19
Tim Potter

Je ne suis pas au courant d'une autre manière que d'utiliser la ressource directory avant la ressource template:

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