Chef: Erstellen Sie ein Verzeichnis für eine Vorlage, falls es noch nicht existiert


16

Wie kann ich sicherstellen, dass das Verzeichnis vorhanden ist, wenn eine Vorlage erstellt wird? Zum Beispiel:

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

Dies schlägt fehl, da /var/www/example/shared/configes nicht database.ymlzum Kopieren gibt. Ich denke darüber nach, wie Puppet es Ihnen ermöglicht, sicherzustellen, dass ein Verzeichnis existiert.

Antworten:


18

Verwenden Sie die Verzeichnisressource , um das Verzeichnis zu erstellen, bevor Sie die Vorlage erstellen. Der Trick besteht darin, auch das recursiveAttribut anzugeben. Andernfalls schlägt die Aktion fehl, es sei denn, alle Teile des Verzeichnisses außer dem letzten sind bereits vorhanden.

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

Beachten Sie, dass das ownerund groupder Verzeichnisressource nur auf das Blattverzeichnis angewendet wird, wenn es erstellt wird. Die Berechtigungen für den Rest des Verzeichnisses sind undefiniert, werden jedoch wahrscheinlich root.root und unabhängig von Ihrer Umask sein.


Deshalb mag ich die recursiveOption nicht ;-)
StephenKing

Ja ich auch. Es fühlt sich einfach nicht sehr an, entweder jedes Level angeben zu müssen oder alles den Vorgaben zu überlassen.
Tim Potter

link broken neuer link für verzeichnisressource ist dieser docs.chef.io/resource_directory.html
Immutable Brick

4

Mir ist keine andere Möglichkeit bekannt, als die directoryRessource vor der templateRessource zu verwenden:

directory "#{node[:app][:deploy_to]}/#{node[:app][:name]}/shared/config/
  owner node[:user][:username]
  group node[:user][:username]
end
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.