¿Llamar a la función Puppet desde la plantilla Puppet?

13

A partir de 0.24.8, ¿puede una plantilla de Puppet llamar a una función de Puppet?

Puedo obtener una funcionalidad similar llamando a la función en mi manifiesto, asignando el valor de retorno a una variable y luego usando lookupvar ('variable') en la plantilla, pero me gustaría eliminar al intermediario.

sh-beta
fuente

Respuestas:

18

Dentro de las plantillas tiene acceso a un objeto de alcance. Se puede acceder a todas las funciones a las que puede acceder en los manifiestos de marionetas a través de ese objeto de alcance, aunque no a través del mismo nombre. Anteponer "function_"al comienzo del nombre de la función. Por ejemplo, aquí incluí una plantilla dentro de otra:<%= scope.function_template("template2.erb") %>

http://reductivelabs.com/trac/puppet/wiki/PuppetTemplating tiene una excelente documentación sobre el objeto de alcance dentro de las plantillas. Para obtener información realmente profunda sobre la plantilla y las funciones, puede mirar adentro lib/puppet/parser/templatewrapper.rby lib/puppet/parser/functions.rb.

Jordan Curzon
fuente
Muchas gracias. Una advertencia para cualquiera que use la función template () en una plantilla: aún debe calificarla como lo hace en un manifiesto de títeres (es decir, scope.function_template ("module / template.erb")).
sh-beta el
¿Es posible usar una variable para que se cargue el nombre del archivo de plantilla para la llamada de función de plantilla dentro de la plantilla? Por ejemplo<%= scope.function_template("sites/$domain/config.erb") %>
Gary el
Absolutamente. Solo tenga en cuenta que está trabajando en Ruby, no en DSL de Puppet, por lo que los nombres de las variables (y las reglas de interpolación) son diferentes. Tu cuerda debería ser <%= scope.function_template("sites/#{domain}/config.erb") %>.
jgoldschrafe
3

Permítanme extender la pregunta también a funciones personalizadas . Básicamente, llama a las funciones personalizadas de la misma manera que a las funciones integradas (usando function_ prefix), pero asegúrese de pasar todos los parámetros en una matriz:

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

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

Tenga en cuenta que también funciona sin los corchetes en algunas versiones de Puppet. Más información: http://docs.puppetlabs.com/guides/custom_functions.html#referencing-custom-functions-in-templates

Otra cosa importante es que hay un error (o característica) en Puppet 2.6 o anterior donde las funciones personalizadas no se cargan automáticamente en el alcance de la plantilla. ¡Necesita cargarlos manualmente , de lo contrario no se encontrará la función!

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

Más información: http://projects.puppetlabs.com/issues/7991

lzap
fuente
-2

No estoy completamente seguro de lo que quiere decir con una función Puppet, pero las plantillas de Puppet están integradas en Ruby, por lo que puede hacer cualquier cosa en las plantillas que pueda en Ruby.

David Pashley
fuente
Las funciones nativas de la marioneta son cosas como fqdn_rand (), sha1 (), etiquetadas (), etc. Las funciones personalizadas de la marioneta se almacenan en los módulos / nombre del módulo / plugins / puppet / parser / functions /. ¿Se pueden llamar desde una plantilla?
sh-beta