Chiamare la funzione Puppet dal modello Puppet?


13

A partire da 0.24.8, un modello Puppet può chiamare una funzione Puppet?

Posso ottenere funzionalità simili chiamando la funzione nel mio manifest, assegnando il valore restituito a una variabile e quindi usando la lookupvar ('variabile') nel modello, ma mi piacerebbe tagliare l'uomo intermedio.

Risposte:


18

All'interno dei modelli hai accesso a un oggetto scope. Tutte le funzioni a cui è possibile accedere nei manifest dei pupazzi sono accessibili tramite l'oggetto scope, anche se non con lo stesso nome. Prependi "function_"all'inizio del nome della funzione. Ad esempio, qui ho incluso un modello all'interno di un altro:<%= scope.function_template("template2.erb") %>

http://reductivelabs.com/trac/puppet/wiki/PuppetTemplating ha un'ottima documentazione sull'oggetto scope all'interno dei template. Per informazioni davvero approfondite su template e funzioni puoi guardare dentro lib/puppet/parser/templatewrapper.rbe lib/puppet/parser/functions.rb.


Grazie mille. Avvertenza per chiunque utilizzi la funzione template () in un modello: è necessario qualificarlo come in un manifest di marionette (ad esempio scope.function_template ("module / template.erb")).
sh-beta,

È possibile utilizzare una variabile per il nome del file modello da caricare per la chiamata della funzione modello all'interno del modello? Ad esempio<%= scope.function_template("sites/$domain/config.erb") %>
Gary,

Assolutamente. Basta essere consapevoli del fatto che stai lavorando in Ruby, non nel DSL di Puppet, quindi i nomi delle variabili (e le regole di interpolazione) sono diversi. La tua stringa dovrebbe essere <%= scope.function_template("sites/#{domain}/config.erb") %>.
jgoldschrafe,

3

Vorrei estendere la domanda anche alle funzioni personalizzate . Fondamentalmente, chiamate le funzioni personalizzate allo stesso modo delle funzioni integrate (usando il prefisso funzione), ma assicuratevi di passare tutti i parametri in un array:

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

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

Nota che funziona anche senza le parentesi graffe quadrate su alcune versioni di Puppet. Maggiori informazioni: http://docs.puppetlabs.com/guides/custom_functions.html#referencing-custom-functions-in-templates

Un'altra cosa importante è che esiste un bug (o funzionalità) in Puppet 2.6 o precedente in cui le funzioni personalizzate non vengono caricate automaticamente nell'ambito del modello. Devi caricarli manualmente , altrimenti non troverai la funzione!

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

Ulteriori informazioni: http://projects.puppetlabs.com/issues/7991


-2

Non sono del tutto sicuro di cosa significhi con una funzione Puppet, ma i modelli di pupazzi sono incorporati in Ruby, quindi puoi fare qualsiasi cosa nei modelli che puoi in Ruby.


Le funzioni di marionette native sono cose come fqdn_rand (), sha1 (), tagged (), ecc. Le funzioni di marionette personalizzate sono memorizzate sotto i moduli / modulename / plugins / puppet / parser / funzioni /. Questi possono essere chiamati all'interno di un modello?
sh-beta,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.