Chef:テンプレートがまだ存在しない場合、テンプレート用のディレクトリを作成します


16

テンプレートを作成している場合、ディレクトリが存在することをどのように確認できますか?例えば:

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を使用してディレクトリの存在を「保証」する方法を考えています。

回答:


18

テンプレートを作成する前に、ディレクトリリソースを使用してディレクトリを作成します。トリックは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

ディレクトリリソースのownerand groupは、作成中のリーフディレクトリにのみ適用されることに注意してください。残りのディレクトリの権限は未定義ですが、おそらくroot.rootとumaskが何であろうとなります。


だからこそ私はこのrecursiveオプションが嫌いです;-)
StephenKing

うん、私も。各レベルを指定する必要も、デフォルトのままにしておく必要もありません。
ティム・ポッター

ディレクトリリソースのリンク切れの新しいリンクはこちら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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.