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.

Matthew
quelle

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.

Tim Potter
quelle
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
Stephen King
quelle