Назад | Перейти на главную страницу

Вызвать функцию Puppet из шаблона Puppet?

Начиная с версии 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.