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


13

Начиная с версии 0.24.8, может ли шаблон Puppet вызывать функцию Puppet?

Я могу получить аналогичную функциональность, вызвав функцию в моем манифесте, присвоив возвращаемое значение переменной, а затем используя lookupvar ('variable') в шаблоне, но я бы хотел исключить посредника.

Ответы:


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, а не в DSL Puppet, поэтому имена переменных (и правила интерполяции) различны. Ваша строка должна быть <%= scope.function_template("sites/#{domain}/config.erb") %>.
jgoldschrafe

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, но шаблоны кукол встроены в Ruby, так что вы можете делать с шаблонами все, что можете в Ruby.


Собственные функции кукол - это такие функции, как fqdn_rand (), sha1 (), tagged () и т. Д. Пользовательские функции Puppet хранятся в модулях / modulename / plugins / puppet / parser / functions /. Могут ли они быть вызваны из шаблона?
sh-beta
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.