Wywołać funkcję Puppet z szablonu Puppet?

13

Czy od wersji 0.24.8 szablon Puppet może wywoływać funkcję Puppet?

Mogę uzyskać podobną funkcjonalność, wywołując funkcję w moim manifeście, przypisując wartość zwracaną do zmiennej, a następnie używając lookupvar („zmiennej”) w szablonie, ale chciałbym wyciąć środkowego człowieka.

sh-beta
źródło

Odpowiedzi:

18

Wewnątrz szablonów masz dostęp do obiektu zakresu. Do wszystkich funkcji, do których można uzyskać dostęp w manifestach marionetkowych, można uzyskać dostęp za pośrednictwem tego obiektu zakresu, chociaż nie pod tą samą nazwą. Przejdź "function_"na początek nazwy funkcji. Na przykład tutaj umieściłem jeden szablon w innym:<%= scope.function_template("template2.erb") %>

http://reductivelabs.com/trac/puppet/wiki/PuppetTemplating ma świetną dokumentację dotyczącą obiektu zasięgu w szablonach. Aby uzyskać naprawdę głębokie informacje o szablonie i funkcjach, możesz zajrzeć do środka lib/puppet/parser/templatewrapper.rbi lib/puppet/parser/functions.rb.

Jordan Curzon
źródło
Wielkie dzięki. Słowo ostrzeżenia dla każdego, kto korzysta z funkcji template () w szablonie: nadal musisz ją zakwalifikować, tak jak w manifestie marionetkowym (tj. Scope.function_template („module / template.erb”)).
sh-beta,
Czy można użyć zmiennej dla nazwy pliku szablonu, aby załadować wywołanie funkcji szablonu w szablonie? Np.<%= scope.function_template("sites/$domain/config.erb") %>
Gary
Absolutnie. Pamiętaj tylko, że pracujesz w Ruby, a nie DSL Puppet, więc nazwy zmiennych (i reguły interpolacji) są różne. Twój ciąg powinien być <%= scope.function_template("sites/#{domain}/config.erb") %>.
jgoldschrafe
3

Pozwolę sobie rozszerzyć pytanie również na funkcje niestandardowe . Zasadniczo wywołujesz funkcje niestandardowe w taki sam sposób, jak funkcje wbudowane (używając prefiksu function_), ale upewnij się, że przekazałeś wszystkie parametry w tablicy:

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

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

Pamiętaj, że działa również bez kwadratowych nawiasów klamrowych w niektórych wersjach Puppet. Więcej informacji: http://docs.puppetlabs.com/guides/custom_functions.html#referencing-custom-functions-in-templates

Inną ważną rzeczą jest błąd (lub funkcja) w Puppet 2.6 lub starszym, w którym funkcje niestandardowe nieautomatycznie ładowane do zakresu szablonu. Musisz załadować je ręcznie , w przeciwnym razie funkcja nie zostanie znaleziona!

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

Więcej informacji: http://projects.puppetlabs.com/issues/7991

lzap
źródło
-2

Nie jestem do końca pewien, co masz na myśli przez funkcję marionetki, ale szablony marionetek są osadzone w Ruby, więc możesz zrobić wszystko w szablonach, co możesz w Ruby.

David Pashley
źródło
Natywne funkcje kukiełkowe to między innymi fqdn_rand (), sha1 (), tagged (), itp. Niestandardowe funkcje kukiełkowe są przechowywane w modułach / nazwa modułu / plugins / puppet / parser / functions /. Czy można je wywoływać z poziomu szablonu?
sh-beta,