Appelez la fonction Puppet à partir du modèle Puppet?

13

Depuis la 0.24.8, un modèle Puppet peut-il appeler une fonction Puppet?

Je peux obtenir des fonctionnalités similaires en appelant la fonction dans mon manifeste, en attribuant la valeur de retour à une variable, puis en utilisant la variable de recherche ('variable') dans le modèle, mais je voudrais supprimer l'homme intermédiaire.

sh-beta
la source

Réponses:

18

À l'intérieur des modèles, vous avez accès à un objet scope. Toutes les fonctions auxquelles vous pouvez accéder dans les manifestes de marionnettes sont accessibles via cet objet scope, mais pas via le même nom. Ajoutez "function_"le début du nom de la fonction. Par exemple, ici j'ai inclus un modèle dans un autre:<%= scope.function_template("template2.erb") %>

http://reductivelabs.com/trac/puppet/wiki/PuppetTemplating propose une excellente documentation sur l'objet scope dans les modèles. Pour des informations très détaillées sur le modèle et les fonctions, vous pouvez consulter l'intérieur lib/puppet/parser/templatewrapper.rbet lib/puppet/parser/functions.rb.

Jordan Curzon
la source
Grand merci. Un mot d'avertissement pour quiconque utilise la fonction template () dans un modèle: vous devez toujours le qualifier comme vous le faites dans un manifeste de marionnettes (par exemple, scope.function_template ("module / template.erb")).
sh-beta
Il est possible d'utiliser une variable pour le nom du fichier de modèle à charger pour l'appel de fonction de modèle dans le modèle? Par exemple<%= scope.function_template("sites/$domain/config.erb") %>
Gary
Absolument. N'oubliez pas que vous travaillez dans Ruby, pas dans DSL de Puppet, donc les noms de variables (et les règles d'interpolation) sont différents. Votre chaîne devrait l'être <%= scope.function_template("sites/#{domain}/config.erb") %>.
jgoldschrafe
3

Permettez-moi également d'étendre la question aux fonctions personnalisées . Fondamentalement, vous appelez des fonctions personnalisées de la même manière que les fonctions intégrées (en utilisant le préfixe function_), mais assurez-vous de passer tous les paramètres dans un tableau:

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

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

Veuillez noter que cela fonctionne également sans les accolades carrées sur certaines versions de Puppet. Plus d'informations: http://docs.puppetlabs.com/guides/custom_functions.html#referencing-custom-functions-in-templates

Une autre chose importante est qu'il existe un bogue (ou une fonctionnalité) dans Puppet 2.6 ou une version antérieure où les fonctions personnalisées ne sont pas chargées automatiquement dans la portée du modèle. Vous devez les charger manuellement , sinon la fonction ne sera pas trouvée!

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

Plus d'infos: http://projects.puppetlabs.com/issues/7991

lzap
la source
-2

Je ne suis pas tout à fait sûr de ce que vous entendez par une fonction Puppet, mais les modèles de marionnettes sont intégrés Ruby, vous pouvez donc faire n'importe quoi dans les modèles que vous pouvez dans Ruby.

David Pashley
la source
Les fonctions de marionnettes natives sont des choses comme fqdn_rand (), sha1 (), tagged (), etc. Les fonctions de marionnettes personnalisées sont stockées sous les modules / modulename / plugins / puppet / parser / functions /. Peut-on les appeler à partir d'un modèle?
sh-beta