คลาสที่กำหนดพารามิเตอร์เป็นโครงสร้างภาษาเพื่อช่วยให้คุณจัดโครงสร้างโค้ดได้ดีขึ้น มันป้องกันคุณจากการใช้ตัวแปรโกลบอลมากเกินไป (เช่นในตัวอย่างของคุณ)
ลองนึกภาพคุณรวม 20 คลาสเพิ่มเติมในคำอธิบายโหนดของคุณและทั้งหมดจะต้องมีตัวแปรบางอย่างที่ถูกตั้งค่าในขอบเขตส่วนกลางหรือโหนดของรายการ นอกจากนี้คลาสที่มีพารามิเตอร์ช่วยให้คุณมีพารามิเตอร์เริ่มต้นได้ง่ายดังนั้นคุณสามารถใช้ค่าเริ่มต้นสำหรับ$file_owner
แทนที่จะต้องระบุค่าเดียวกัน (เช่นlarry
) ในหลาย ๆ ที่
ตัวอย่างข้อมูลของคุณ (ที่มีสองโหนดเพิ่มเติม) สามารถเขียนได้ดังนี้:
node 'example.com' {
class { bar: }
}
node 'example.net' {
class { bar: owner = "harry" }
}
node 'example.net' {
class { bar: file_name = "barry.txt" }
}
class bar($owner = "larry", $file_name = "larry.txt") {
class { do_stuff: owner => $owner, file_name => $file_name }
}
class do_stuff($owner, $file_name) {
file { $file_name:
ensure => file,
owner => $owner,
}
}
ด้วยการใช้งานตัวแปรส่วนกลางคุณจะต้องประกาศตัวแปรที่มีชื่อ$owner
ในแต่ละโหนดและคุณจะไม่สามารถเขียนทับ$file_name
ตัวแปร / พารามิเตอร์ต่อโหนดได้ แต่คุณจะต้องประกาศbar
คลาสอื่นสำหรับแต่ละโหนด
เอกสารเกี่ยวกับวิวัฒนาการทางภาษาของ Puppet และแน่นอนว่าคู่มือภาษามีตัวอย่างที่ดีเกี่ยวกับวิธีใช้คลาสที่กำหนดพารามิเตอร์และเหตุผลที่อยู่เบื้องหลังโครงสร้างภาษานี้:
$bar::file_name
และ$::file_owner
เข้าถึงตัวแปรเหล่านั้นตามลำดับ อย่างไรก็ตามเมื่อใช้คลาส parametrized ตัวแปรที่ส่งผ่านไปยังคลาสผ่านพารามิเตอร์จะกลายเป็นตัวแปรที่กำหนดขอบเขตแบบโลคัล