Puppet-Funktion aus Puppet-Vorlage aufrufen?

13

Kann eine Puppet-Vorlage ab Version 0.24.8 eine Puppet-Funktion aufrufen?

Ich kann ähnliche Funktionen erhalten, indem ich die Funktion in meinem Manifest aufrufe, den Rückgabewert einer Variablen zuordne und dann die Lookupvar ('Variable') in der Vorlage verwende, aber ich möchte den mittleren Mann ausschneiden.

sh-beta
quelle

Antworten:

18

Innerhalb von Vorlagen haben Sie Zugriff auf ein Bereichsobjekt. Auf alle Funktionen, auf die Sie in den Puppenmanifesten zugreifen können, kann über dieses Scope-Objekt zugegriffen werden, jedoch nicht über denselben Namen. Vor "function_"den Anfang des Funktionsnamens stellen. Zum Beispiel habe ich hier eine Vorlage in eine andere eingefügt:<%= scope.function_template("template2.erb") %>

http://reductivelabs.com/trac/puppet/wiki/PuppetTemplating enthält eine hervorragende Dokumentation zum Bereichsobjekt in Vorlagen. Für wirklich tiefe Informationen zu Vorlagen und Funktionen können Sie in lib/puppet/parser/templatewrapper.rbund nachschauen lib/puppet/parser/functions.rb.

Jordan Curzon
quelle
Vielen Dank. Ein Hinweis für alle, die die template () - Funktion in einer Vorlage verwenden: Sie müssen sie dennoch wie in einem Puppenmanifest qualifizieren (z. B. scope.function_template ("module / template.erb")).
sh-beta
Ist es möglich, eine Variable für den Namen der Vorlagendatei zu verwenden, die für den Funktionsaufruf der Vorlage innerhalb der Vorlage geladen werden soll? ZB<%= scope.function_template("sites/$domain/config.erb") %>
Gary
Absolut. Denken Sie nur daran, dass Sie in Ruby und nicht in Puppets DSL arbeiten, sodass die Variablennamen (und Interpolationsregeln) unterschiedlich sind. Ihre Zeichenfolge sollte sein <%= scope.function_template("sites/#{domain}/config.erb") %>.
Jgoldschrafe
3

Lassen Sie mich die Frage auch auf benutzerdefinierte Funktionen ausweiten . Grundsätzlich rufen Sie benutzerdefinierte Funktionen wie integrierte Funktionen auf (mit dem Präfix function_), aber stellen Sie sicher, dass Sie alle Parameter in einem Array übergeben:

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

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

Bitte beachten Sie, dass es bei einigen Puppet-Versionen auch ohne eckige Klammern funktioniert. Weitere Informationen: http://docs.puppetlabs.com/guides/custom_functions.html#referencing-custom-functions-in-templates

Eine andere wichtige Sache ist, dass es einen Fehler (oder eine Funktion) in Puppet 2.6 oder älter gibt, bei dem benutzerdefinierte Funktionen nicht automatisch in den Vorlagenbereich geladen werden. Sie müssen manuell geladen werden , da sonst keine Funktion gefunden wird!

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

Weitere Informationen: http://projects.puppetlabs.com/issues/7991

lzap
quelle
-2

Ich bin mir nicht ganz sicher, was Sie mit einer Puppet-Funktion meinen, aber Puppet-Vorlagen sind in Ruby eingebettet, sodass Sie in den Vorlagen alles tun können, was Sie in Ruby können.

David Pashley
quelle
Native Puppet-Funktionen sind Dinge wie fqdn_rand (), sha1 (), tagged () usw. Benutzerdefinierte Puppet-Funktionen werden unter den Modulen / modulename / plugins / puppet / parser / functions / gespeichert. Können diese aus einer Vorlage heraus aufgerufen werden?
sh-beta