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.

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.


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


-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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.