web-dev-qa-db-ja.com

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が存在しないため、これは失敗します。人形がディレクトリの存在を「保証」する方法を考えています。

17
Matthew

テンプレートを作成する前に、 directory resource を使用してディレクトリを作成します。トリックは、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は何であってもかまいません。

19
Tim Potter

directoryリソースの前にtemplateリソースを使用する以外の方法は知りません。

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