Chef:如果模板目录不存在,则创建该目录

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。我在思考 puppet 如何允许您“确保”目录存在。

答案1

使用目录资源在创建模板之前创建目录。诀窍是还要指定属性,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

请注意,目录资源的ownergroup仅在创建时应用于叶目录。目录其余部分的权限未定义,但可能是 root.root 和您的 umask。

答案2

directory除了在资源之前使用资源之外,我不知道还有其他方法template

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

相关内容