Chef: crie um diretório para um modelo, se ele ainda não existir

16

Se eu tiver um modelo sendo criado, como posso garantir que o diretório exista? Por exemplo:

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

Isso falha, pois /var/www/example/shared/confignão existe para database.ymlser copiado. Estou pensando em como o fantoche permite que você "garanta" a existência de um diretório.

Mateus
fonte

Respostas:

18

Use o recurso de diretório para criar o diretório antes de criar o modelo. O truque é também especificar o recursiveatributo, caso contrário a ação falhará, a menos que todas as partes do diretório, mas a última já exista.

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

Observe que o ownere groupdo recurso de diretório são aplicados apenas ao diretório folha quando ele está sendo criado. As permissões do restante do diretório são indefinidas, mas provavelmente serão root.root e qualquer que seja o seu umask.

Tim Potter
fonte
É por isso que eu não gosto da recursiveopção ;-)
StephenKing
Sim eu também. Simplesmente não parece muito necessário ter que especificar cada nível ou deixar tudo por padrão.
Tim Potter
link quebrado novo link para o recurso de diretório é este docs.chef.io/resource_directory.html
Immutable Brick
4

Não conheço outra maneira que não seja usar o directoryrecurso antes do templaterecurso:

directory "#{node[:app][:deploy_to]}/#{node[:app][:name]}/shared/config/
  owner node[:user][:username]
  group node[:user][:username]
end
StephenKing
fonte