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.

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.