Call Puppet function from Puppet template?

Solution 1:

Inside templates you have access to a scope object. All of the functions that you can access in the puppet manifests can be accessed via that scope object, although not via the same name. Prepend "function_" to the beginning of the function name. For example, here I included one template inside another: <%= scope.function_template("template2.erb") %>

http://reductivelabs.com/trac/puppet/wiki/PuppetTemplating has great documentation about the scope object inside templates. For really deep information about template and functions you can look inside lib/puppet/parser/templatewrapper.rb and lib/puppet/parser/functions.rb.

Solution 2:

Let me extend the question also to custom functions. Basically, you call custom functions the same way as built-in functions (using function_ prefix), but make sure you pass all params in an array:

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

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

Please note it also works without the square braces on some Puppet versions. More info: https://puppet.com/docs/puppet/latest/functions_ruby_overview.html

Another important thing is there is a bug (or feature) in Puppet 2.6 or older where custom functions are not auto-loaded into the template scope. You need to load them manually, otherwise function wont be found!

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

More info: http://projects.puppetlabs.com/issues/7991