Chamar a função Puppet do modelo Puppet?

13

A partir de 0.24.8, um modelo Puppet pode chamar uma função Puppet?

Posso obter funcionalidades semelhantes chamando a função no meu manifesto, atribuindo o valor de retorno a uma variável e, em seguida, usando a lookupvar ('variável') no modelo, mas gostaria de cortar o intermediário.

sh-beta
fonte

Respostas:

18

Nos modelos internos, você tem acesso a um objeto de escopo. Todas as funções que você pode acessar nos manifestos de fantoches podem ser acessadas por meio desse objeto de escopo, embora não pelo mesmo nome. Anexar "function_"ao início do nome da função. Por exemplo, aqui incluí um modelo dentro de outro:<%= scope.function_template("template2.erb") %>

http://reductivelabs.com/trac/puppet/wiki/PuppetTemplating possui excelente documentação sobre o objeto de escopo nos modelos. Para informações realmente profundas sobre modelos e funções, você pode procurar por dentro lib/puppet/parser/templatewrapper.rbe por lib/puppet/parser/functions.rb.

Jordan Curzon
fonte
Ótimo, obrigado. Cuidado para quem usa a função template () em um modelo: você ainda precisa qualificá-lo como em um manifesto de fantoche (por exemplo, scope.function_template ("module / template.erb")).
sh-beta
É possível usar uma variável para o nome do arquivo de modelo carregar para a chamada de função do modelo dentro do modelo? Exemplo<%= scope.function_template("sites/$domain/config.erb") %>
Gary
Absolutamente. Lembre-se de que você está trabalhando no Ruby, não no DSL do Puppet, portanto os nomes das variáveis ​​(e regras de interpolação) são diferentes. Sua string deve ser <%= scope.function_template("sites/#{domain}/config.erb") %>.
precisa saber é o seguinte
3

Deixe-me estender a pergunta também para funções personalizadas . Basicamente, você chama funções personalizadas da mesma maneira que as funções internas (usando o prefixo da função_), mas certifique-se de passar todos os parâmetros em uma matriz:

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

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

Observe que ele também funciona sem colchetes em algumas versões do Puppet. Mais informações: http://docs.puppetlabs.com/guides/custom_functions.html#referencing-custom-functions-in-templates

Outra coisa importante é que há um bug (ou recurso) no Puppet 2.6 ou mais antigo, em que funções personalizadas não são carregadas automaticamente no escopo do modelo. Você precisa carregá-los manualmente , caso contrário, a função não será encontrada!

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

Mais informações: http://projects.puppetlabs.com/issues/7991

lzap
fonte
-2

Não tenho muita certeza do que você quer dizer com uma função Puppet, mas os modelos de fantoches são incorporados ao Ruby, para que você possa fazer qualquer coisa nos modelos que puder no Ruby.

David Pashley
fonte
Funções nativas de fantoches são coisas como fqdn_rand (), sha1 (), etiquetadas (), etc. As funções personalizadas de fantoches são armazenadas nos módulos / nome do módulo / plugins / fantoches / analisador / funções /. Eles podem ser chamados de dentro de um modelo?
sh-beta