Chef: créez un répertoire pour un modèle s'il n'existe pas déjà

17

Si un modèle est en cours de création, comment puis-je m'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 car /var/www/example/shared/confign'existe pas pour database.ymlêtre copié. Je pense à la façon dont la marionnette vous permet de "garantir" l'existence d'un répertoire.

Matthieu
la source

Réponses:

19

Utilisez la ressource d'annuaire pour créer l'annuaire avant de créer le modèle. L'astuce consiste à spécifier également l' recursiveattribut, sinon l'action échouera à moins que toutes les parties du répertoire, sauf la dernière, 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 owneret groupde la ressource de répertoire ne sont appliqués au répertoire feuille que lors de sa création. Les autorisations du reste du répertoire ne sont pas définies, mais seront probablement root.root et quel que soit votre umask.

Tim Potter
la source
C'est pourquoi je n'aime pas l' recursiveoption ;-)
StephenKing
Ouais moi aussi. Il ne semble tout simplement pas très Chef-y d'avoir à spécifier chaque niveau ou de tout laisser aux valeurs par défaut.
Tim Potter
lien cassé nouveau lien pour la ressource d'annuaire est ce docs.chef.io/resource_directory.html
Brick
4

Je ne connais pas d'autre moyen que d'utiliser la directoryressource avant la templateressource:

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