从Puppet模板调用Puppet函数?


13

从0.24.8开始,Puppet模板可以调用Puppet函数吗?

通过在清单中调用函数,将返回值分配给变量,然后在模板中使用lookupvar('variable'),我可以获得类似的功能,但我想裁掉中间人。

Answers:


18

在模板内部,您可以访问范围对象。您可以在人偶清单中访问的所有功能都可以通过该范围对象访问,尽管不能使用相同的名称。前面加上"function_"函数名的开头。例如,这里我在另一个模板中包含了一个模板:<%= scope.function_template("template2.erb") %>

http://reductivelabs.com/trac/puppet/wiki/PuppetTemplating具有有关模板内部范围对象的出色文档。有关模板和功能的真正深入信息,您可以查看lib/puppet/parser/templatewrapper.rb和查阅lib/puppet/parser/functions.rb


太谢谢了。对在模板中使用template()函数的任何人的警告:您仍然必须像在木偶清单中一样对它进行限定(即scope.function_template(“ module / template.erb”))。
sh-beta

是否可以使用变量作为模板文件的名称,以便在模板内加载模板函数调用?例如<%= scope.function_template("sites/$domain/config.erb") %>
Gary

绝对。请注意,您使用的是Ruby,而不是Puppet的DSL,因此变量名称(和插值规则)不同。您的字符串应为<%= scope.function_template("sites/#{domain}/config.erb") %>
jgoldschrafe 2012年

3

让我也将问题扩展到自定义函数。基本上,您以与内置函数相同的方式调用自定义函数(使用function_前缀),但是请确保在数组中传递所有参数:

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

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

请注意,在某些Puppet版本中,也可以在不使用方括号的情况下使用。更多信息:http : //docs.puppetlabs.com/guides/custom_functions.html#referencing-custom-functions-in-templates

另一个重要的事情是Puppet 2.6或更早版本中存在一个错误(或功能),其中自定义功能不会自动加载到模板范围中。您需要手动加载它们,否则将找不到功能!

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

更多信息:http : //projects.puppetlabs.com/issues/7991


-2

我不能完全确定Puppet函数的含义,但是Puppet模板是嵌入式Ruby,因此您可以在模板中执行与Ruby中相同的任何操作。


本地人偶功能是诸如fqdn_rand(),sha1(),tagd()等之类。自定义人偶功能存储在模块/模块名称/插件/人偶/解析器/功能/下。可以从模板中调用它们吗?
sh-beta
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.