Chef:为模板创建目录(如果尚不存在)


17

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

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要复制到的操作,因此失败。我在考虑p如何允许您“确保”目录存在。

Answers:


19

在创建模板之前,请使用目录资源创建目录。技巧还在于指定recursive属性,否则操作将失败,除非目录的所有部分(但最后一个部分)都已存在。

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

请注意,目录资源中的owner和和group仅在创建叶子目录时应用于叶子目录。该目录其余部分的权限是不确定的,但可能是root.root以及您的umask是什么。


这就是为什么我不喜欢该recursive选项的原因;-)
StephenKing 2013年

我也是。只是感觉不很专业,您不必指定每个级别或将其全部保留为默认值。
蒂姆·波特2013年

链接断开了目录资源的新链接,这是docs.chef.io/resource_directory.html
不可变砖

4

除了在directory资源之前使用资源外,我不知道其他任何方式template

directory "#{node[:app][:deploy_to]}/#{node[:app][:name]}/shared/config/
  owner node[:user][:username]
  group node[:user][:username]
end
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.