Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

As of 0.24.8, can a Puppet template call a Puppet function?

I can get similar functionality by calling the function in my manifest, assigning the return value to a variable, and then using the lookupvar('variable') in the template, but I'd like to cut out the middle man.

share|improve this question
add comment

3 Answers 3

up vote 12 down vote accepted

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.

share|improve this answer
    
Great, thanks. Word of caution to anyone using the template() function in a template: you still have to qualify it like you do in a puppet manifest (ie, scope.function_template("module/template.erb")). –  sh-beta Jul 2 '09 at 13:49
    
It is possible to use a variable for the name of the template file to load for the template function call within the template? E.g. <%= scope.function_template("sites/$domain/config.erb") %> –  Gary Apr 20 '12 at 19:18
    
Absolutely. Just be mindful that you're working in Ruby, not Puppet's DSL, so the variable names (and interpolation rules) are different. Your string should be <%= scope.function_template("sites/#{domain}/config.erb") %>. –  jgoldschrafe Apr 26 '12 at 13:10
add comment

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: http://docs.puppetlabs.com/guides/custom_functions.html#referencing-custom-functions-in-templates

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

share|improve this answer
add comment

I'm not entirely sure what you mean by a Puppet function, but puppet templates are embedded Ruby, so you can do anything in the templates that you can in Ruby.

share|improve this answer
    
Native puppet functions are things like fqdn_rand(), sha1(), tagged(), etc. Custom Puppet functions are stored under the modules/modulename/plugins/puppet/parser/functions/. Can these be called from within a template? –  sh-beta Jul 1 '09 at 20:29
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.