Chef:如果模板尚不存在,则为其创建一个目录

如果我正在创建模板,我该如何确保该目录存在?例如:

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

由于/ var / www / example / shared / config不存在而无法复制到database.yml,因此失败.我在想木偶如何让你“确保”目录的存在.

最佳答案
在创建模板之前使用directory resource创建目录.诀窍是还指定递归属性,否则操作将失败,除非目录的所有部分都已存在但是最后一部分存在.

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

请注意,目录资源的所有者和组仅在创建时应用于叶子目录.目录的其余部分的权限是未定义的,但可能是root.root和你的umask是什么.

转载注明原文:Chef:如果模板尚不存在,则为其创建一个目录 - 代码日志