Szef kuchni: utwórz katalog dla szablonu, jeśli jeszcze nie istnieje

17

Jeśli tworzony jest szablon, jak mogę upewnić się, że katalog istnieje? Na przykład:

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

Nie udaje się to, ponieważ /var/www/example/shared/confignie można database.ymlgo skopiować. Myślę o tym, jak marionetka pozwala „upewnić się”, że istnieje katalog.

Mateusz
źródło

Odpowiedzi:

19

Użyj zasobu katalogu, aby utworzyć katalog przed utworzeniem szablonu. Sztuczka polega również na określeniu recursiveatrybutu, w przeciwnym razie akcja zakończy się niepowodzeniem, chyba że wszystkie części katalogu oprócz ostatniej już istnieją.

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

Należy zauważyć, że owneri groupzasobu katalogu są stosowane tylko do katalogu liścia, gdy jest tworzony. Uprawnienia pozostałej części katalogu są niezdefiniowane, ale prawdopodobnie będzie to root.root i cokolwiek to jest umask.

Tim Potter
źródło
Dlatego nie lubię tej recursiveopcji ;-)
StephenKing
Tak, ja też. Po prostu nie wydaje się, żeby Chef-y musiał określać każdy poziom lub pozostawić wszystko do ustawień domyślnych.
Tim Potter
link uszkodzony nowy link do zasobu katalogu to ten docs.chef.io/resource_directory.html
Brick
4

Nie znam żadnego innego sposobu niż użycie directoryzasobu przed templatezasobem:

directory "#{node[:app][:deploy_to]}/#{node[:app][:name]}/shared/config/
  owner node[:user][:username]
  group node[:user][:username]
end
StephenKing
źródło