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" จะทำงาน