Panggil fungsi Wayang dari template Wayang?

13

Pada 0.24.8, bisakah templat wayang memanggil fungsi wayang?

Saya bisa mendapatkan fungsionalitas yang sama dengan memanggil fungsi di manifes saya, menetapkan nilai kembali ke variabel, dan kemudian menggunakan lookupvar ('variabel') di templat, tapi saya ingin memotong perantara.

sh-beta
sumber

Jawaban:

18

Templat di dalam Anda memiliki akses ke objek lingkup. Semua fungsi yang dapat Anda akses di manifes wayang dapat diakses melalui objek lingkup itu, meskipun tidak melalui nama yang sama. Tambahkan "function_"ke awal nama fungsi. Misalnya, di sini saya menyertakan satu templat di dalam yang lain:<%= scope.function_template("template2.erb") %>

http://reductivelabs.com/trac/puppet/wiki/PuppetTemplating memiliki dokumentasi yang bagus tentang objek lingkup di dalam templat. Untuk informasi yang sangat mendalam tentang template dan fungsi Anda dapat melihat ke dalam lib/puppet/parser/templatewrapper.rbdan lib/puppet/parser/functions.rb.

Jordan Curzon
sumber
Terima kasih banyak. Kata peringatan kepada siapa pun yang menggunakan fungsi templat () dalam templat: Anda masih harus memenuhi syarat seperti yang Anda lakukan dalam manifes wayang (yaitu, scope.function_template ("module / template.erb")).
sh-beta
Dimungkinkan untuk menggunakan variabel untuk nama file template untuk memuat untuk panggilan fungsi template dalam template? Misalnya<%= scope.function_template("sites/$domain/config.erb") %>
Gary
Benar. Perlu diingat bahwa Anda bekerja di Ruby, bukan DSL Puppet, jadi nama variabel (dan aturan interpolasi) berbeda. Tali Anda seharusnya <%= scope.function_template("sites/#{domain}/config.erb") %>.
jgoldschrafe
3

Izinkan saya memperluas pertanyaan juga ke fungsi khusus . Pada dasarnya, Anda memanggil fungsi kustom dengan cara yang sama seperti fungsi bawaan (menggunakan awalan function_), tetapi pastikan Anda melewatkan semua params dalam array:

module Puppet::Parser::Functions
  newfunction(:namegoeshere, :type => :rvalue) do |args|
    # ...
  end
end

<%= scope.function_namegoeshere(["one","two"]) %>

Harap dicatat ini juga berfungsi tanpa kawat gigi persegi pada beberapa versi Wayang. Info lebih lanjut: http://docs.puppetlabs.com/guides/custom_functions.html#referencing-custom-functions-in-templates

Hal penting lainnya adalah ada bug (atau fitur) di Puppet 2.6 atau lebih tua di mana fungsi kustom tidak dimuat secara otomatis ke dalam lingkup templat. Anda perlu memuatnya secara manual , jika tidak berfungsi tidak akan ditemukan!

<% Puppet::Parser::Functions::function('namegoeshere') %>

Info lebih lanjut: http://projects.puppetlabs.com/issues/7991

lzap
sumber
-2

Saya tidak sepenuhnya yakin apa yang Anda maksud dengan fungsi wayang, tetapi template wayang tertanam Ruby, sehingga Anda dapat melakukan apa pun di template yang Anda bisa di Ruby.

David Pashley
sumber
Fungsi boneka asli adalah hal-hal seperti fqdn_rand (), sha1 (), tagged (), dll. Fungsi Boneka kustom disimpan di bawah modul / modulename / plugins / boneka / parser / fungsi /. Bisakah ini dipanggil dari dalam templat?
sh-beta