Tại sao tôi nên sử dụng một lớp tham số con rối?


12

Nói chung khi làm việc với các mô đun con rối phức tạp, tôi sẽ đặt các biến ở cấp nút hoặc bên trong một lớp. ví dụ,

node 'foo.com' {
  $file_owner = "larry" 
  include bar 
}

class bar { 
  $file_name = "larry.txt"
  include do_stuff
}

class do_stuff {
  file { $file_name:
    ensure => file,
    owner  => $file_owner,
  }
}

Làm thế nào / khi / tại sao các lớp tham số giúp đỡ khi tình huống này? Làm thế nào bạn đang sử dụng các lớp tham số hóa để cấu trúc các mô đun con rối của bạn?


2
Lưu ý cho tất cả những ai tìm thấy ví dụ này, mã này hiển thị tra cứu biến toàn cục được phép trong phiên bản Puppet <3.0. Trong Puppet> 3.0, bạn không thể truy cập các biến ngoài phạm vi và phải sử dụng không gian tên để truy cập các biến. Trong ví dụ này, bạn sẽ phải sử dụng $bar::file_name$::file_ownertruy cập các biến tương ứng đó. Tuy nhiên, khi sử dụng các lớp tham số hóa, các biến được truyền vào một lớp thông qua các tham số trở thành các biến có phạm vi cục bộ.
cướp

Câu trả lời:


12

Các lớp tham số hóa là một cấu trúc ngôn ngữ để giúp bạn cấu trúc mã của mình tốt hơn. Nó ngăn bạn sử dụng quá mức các biến toàn cục (như trong ví dụ của bạn).

Hãy tưởng tượng bạn đã bao gồm thêm 20 lớp trong mô tả nút của mình và tất cả sẽ cần một số biến được đặt trong phạm vi toàn cầu hoặc nút của tệp kê khai. Các lớp được tham số hóa cũng cho phép bạn có các tham số mặc định một cách dễ dàng, vì vậy bạn có thể sử dụng một giá trị mặc định cho $file_ownerthay vì phải cung cấp cùng một giá trị (ví dụ larry) ở một số nơi khác nhau.

Đoạn ví dụ của bạn (có hai nút bổ sung) có thể được viết như sau:

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,
  }
}

Với việc sử dụng các biến toàn cục của bạn, bạn cần khai báo một biến có tên $ownertrong mỗi nút và bạn sẽ không thể ghi đè $file_namebiến / tham số trên mỗi nút. Thay vào đó, bạn cần khai báo một barlớp khác cho mỗi nút.

Tài liệu về tiến hóa ngôn ngữ của Puppet và tất nhiên hướng dẫn ngôn ngữ cung cấp một số ví dụ hay về cách sử dụng các lớp được tham số hóa và lý do đằng sau cấu trúc ngôn ngữ này:


8

Cách tốt nhất để suy nghĩ về điều này là đến với nó ngay từ đầu thay vì bắt đầu với việc đã biết các thành ngữ Puppet.

Điều bạn đang cố gắng thực hiện ở nơi đầu tiên là truyền tham số vào một lớp - bạn đang cung cấp cho nó thông tin cần thiết để quyết định cách hành xử, giống như truyền đối số cho hàm. Giả sử đây là perl và bạn có một hàm gọi là Multiply_squares. Bạn sẽ gọi nó như thế multiply_squares(3, 4), không đặt một số biến toàn cục thành 3 và 4 và sau đó đọc chúng từ bên trong hàm!

Nhưng trong lịch sử, mã rối đã phải làm điều đó với các biến toàn cục hoặc phạm vi động, bởi vì nhu cầu thực hiện nó nảy sinh trước khi ngôn ngữ được thiết kế để làm điều đó. Cá nhân, tôi nghĩ rằng một khi các lớp được tham số hóa phát triển hơn một chút và được triển khai rộng rãi hơn, về cơ bản chúng sẽ khiến các vấn đề phạm vi biến đổi trở thành quá khứ, bởi vì có công cụ phù hợp cho công việc sẽ loại bỏ toàn bộ các lớp hack đáng sợ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.