Câu trả lời:
Bên trong các mẫu bạn có quyền truy cập vào một đối tượng phạm vi. Tất cả các hàm mà bạn có thể truy cập trong bảng kê khai con rối có thể được truy cập thông qua đối tượng phạm vi đó, mặc dù không thông qua cùng tên. Chuẩn bị "function_"
cho phần đầu của tên hàm. Ví dụ, ở đây tôi đã bao gồm một mẫu bên trong một mẫu khác:<%= scope.function_template("template2.erb") %>
http://reducteelsabs.com/trac/puppet/wiki/PuppetTemplating có tài liệu tuyệt vời về đối tượng phạm vi bên trong các mẫu. Để biết thông tin thực sự sâu sắc về mẫu và chức năng, bạn có thể nhìn vào bên trong lib/puppet/parser/templatewrapper.rb
và lib/puppet/parser/functions.rb
.
<%= scope.function_template("sites/$domain/config.erb") %>
<%= scope.function_template("sites/#{domain}/config.erb") %>
.
Hãy để tôi mở rộng câu hỏi cũng cho các chức năng tùy chỉnh . Về cơ bản, bạn gọi các hàm tùy chỉnh giống như các hàm dựng sẵn (sử dụng tiền tố function_), nhưng hãy đảm bảo bạn vượt qua tất cả các tham số trong một mảng:
module Puppet::Parser::Functions
newfunction(:namegoeshere, :type => :rvalue) do |args|
# ...
end
end
<%= scope.function_namegoeshere(["one","two"]) %>
Xin lưu ý rằng nó cũng hoạt động mà không có dấu ngoặc vuông trên một số phiên bản Puppet. Thông tin thêm: http://docs.puppetlabs.com/guides/custom_fifts.html#references-custom-fifts-in-temsheet
Một điều quan trọng khác là có một lỗi (hoặc tính năng) trong Puppet 2.6 trở lên trong đó các chức năng tùy chỉnh không được tự động tải vào phạm vi mẫu. Bạn cần tải chúng bằng tay , nếu không chức năng sẽ không được tìm thấy!
<% Puppet::Parser::Functions::function('namegoeshere') %>
Thông tin thêm: http://projects.puppetlabs.com/issues/7991
Tôi không hoàn toàn chắc chắn ý của bạn về chức năng Puppet, nhưng các mẫu rối được nhúng Ruby, vì vậy bạn có thể làm bất cứ điều gì trong các mẫu mà bạn có thể có trong Ruby.