Chef - ข้ามแพลตฟอร์มสำหรับตำราอาหาร
ตำราอาหารข้ามแพลตฟอร์มคือตำราอาหารที่ใช้สภาพแวดล้อมพื้นฐานที่จะทำงาน Chef มีคุณสมบัติมากมายซึ่งช่วยในการเขียนตำราอาหารข้ามแพลตฟอร์มที่สามารถทำงานบนระบบปฏิบัติการใดก็ได้ซึ่งจะนำไปใช้งาน สิ่งนี้ช่วยให้นักพัฒนาสามารถเขียนตำราอาหารที่ใช้งานได้อย่างสมบูรณ์
ในการทำเช่นนี้เราต้องมีตำราอาหาร ในกรณีของเราจะเป็น test_cookbook และ run list ซึ่งจะมีคำจำกัดความของตำราอาหารอยู่
วิธีการทำงาน
การเรียกดูรายละเอียดแพลตฟอร์มโหนดและการเรียกใช้ตรรกะเงื่อนไขในตำราอาหารของเราขึ้นอยู่กับแพลตฟอร์ม ในกรณีของเราเราจะทดสอบกับ Ubuntu
Step 1 - บันทึกข้อความหากโหนดเป็น Ubuntu
vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb
Log.info("Running on ubuntu") if node.platform['ubuntu']
Step 2 - อัปโหลดตำราอาหารไปยังเซิร์ฟเวอร์ Chef
vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb
Uploading my_cookbook [0.1.0]
Uploaded 1 cookbook.
Step 3 - เรียกใช้ไคลเอ็นต์ Chef บนโหนด
user@server:~$ sudo chef-client
...TRUNCATED OUTPUT...
[2013-03-03T20:07:39+00:00] INFO: Running on Ubuntu
...TRUNCATED OUTPUT...
อีกทางเลือกหนึ่งหากใครไม่สนใจแพลตฟอร์มใดแพลตฟอร์มหนึ่ง แต่ต้องการเพียงแค่รู้ว่ากำลังใช้แพลตฟอร์มใดอยู่ก็สามารถใช้คำสั่งต่อไปนี้ได้
Log.info("Running on a debian derivative") if
platform_family?('debian')
การอัปโหลดตำราอาหารที่แก้ไขแล้วและเรียกใช้ไคลเอนต์ Chef บนโหนด Ubuntu จะแสดงผลลัพธ์ต่อไปนี้
[2013-03-03T20:16:14+00:00] INFO: Running on a debian
derivative
เวิร์กโฟลว์ของสคริปต์
ในคำสั่งดังกล่าว Ohai จะค้นพบสถานะปัจจุบันของระบบปฏิบัติการของโหนดและจัดเก็บเป็นแอตทริบิวต์แพลตฟอร์มพร้อมกับอ็อบเจ็กต์โหนด
node['platform']
หรือคุณสามารถใช้ไวยากรณ์สไตล์วิธีการ -
node.platform
การตั้งค่าเฉพาะแพลตฟอร์ม
ในการกำหนดค่าเฉพาะแพลตฟอร์มเชฟเสนอวิธีอำนวยความสะดวก value_for_platform และ value_for_platform_family สามารถใช้เพื่อหลีกเลี่ยง case statement ที่ซับซ้อนและใช้แฮชธรรมดาแทน
ตัวอย่างตำราอาหาร
execute "start-runsvdir" do
command value_for_platform(
"debian" => { "default" => "runsvdir-start" },
"ubuntu" => { "default" => "start runsvdir" },
"gentoo" => { "default" => "/etc/init.d/runit-start start" }
)
action :nothing
end
ในตัวอย่างข้างต้นคำสั่งคือ OS เฉพาะตามที่กำหนดไว้
- สำหรับ Debian "runvdir-start" จะทำงาน
- สำหรับ Ubuntu "start runningvdir" จะทำงาน
- สำหรับ Gentoo "/etc/init.d/runit-start" จะทำงาน