Начиная с версии 0.24.8, может ли шаблон Puppet вызывать функцию Puppet?
Я могу получить аналогичную функциональность, вызвав функцию в моем манифесте, присвоив возвращаемое значение переменной, а затем используя lookupvar ('переменную') в шаблоне, но я бы хотел вырезать среднего человека.
Внутри шаблонов у вас есть доступ к объекту области видимости. Все функции, к которым вы можете получить доступ в манифестах марионетки, можно получить через этот объект области, хотя и не через одно и то же имя. Подготовить "function_"
в начало имени функции. Например, здесь я включил один шаблон в другой: <%= scope.function_template("template2.erb") %>
http://reductivelabs.com/trac/puppet/wiki/PuppetTemplating имеет отличную документацию об объекте области внутри шаблонов. Для действительно подробной информации о шаблоне и функциях вы можете заглянуть внутрь lib/puppet/parser/templatewrapper.rb
и lib/puppet/parser/functions.rb
.
Позвольте мне расширить вопрос также на пользовательские функции. По сути, вы вызываете пользовательские функции так же, как встроенные функции (используя префикс 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
Я не совсем уверен, что вы подразумеваете под функцией Puppet, но шаблоны марионеток встроены в Ruby, поэтому вы можете делать в шаблонах все, что вы можете в Ruby.