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ที่จะคัดลอกไปยัง ฉันคิดว่าหุ่นเชิดอนุญาตให้คุณ "มั่นใจ" มีไดเรกทอรีอยู่อย่างไร

คำตอบ:


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

ใช่ฉันด้วย. ไม่รู้สึกว่า Chef-y ต้องระบุแต่ละระดับหรือปล่อยให้เป็นค่าเริ่มต้น
Tim Potter

link เสียลิงค์ใหม่สำหรับทรัพยากรไดเรกทอรี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.