2016-02-01 24 views
7

Ich baue eine Art Gewohnheit, und ich bin nicht in der Lage den Zugang zum hiera Umfang erhalten von einem defaultto BlockZugang hiera Umfang von Puppet benutzerdefinierten Typ

module Puppet 
    require 'puppet/parser/functions/hiera' 
    newtype(:my_type) do 

    ensurable 

    newparam(:myparam) do 
     defaultto { Puppet::Parser::Functions.hiera('myparam') } 
    end 
    newproperty(:value) do 
     desc "Value of the item." 
    end 
    end 
end 

Aber ich bekomme

Error: undefined method `hiera' for Puppet::Parser::Functions:Module 

ich verwende eigentlich Puppet 3.8 und zukünftige Parser

Als Abhilfe können, verwenden wir

$my_vals = hiera_hash('mytype_vals') 
    create_resource(my_type, $myvals, {myparam => hiera('myparam')}) 

Das funktioniert gut, aber my_type Objekte werden voraussichtlich überall im Katalog auszuprägen, ein myparam wird erwartet, dass das gleiche über alle Instanzen hinweg sein. Daher sollte eine mehrfache Vorgabewertdeklaration nicht notwendig sein.

würde Ein anderer Ansatz

My_type{ 
    myparam => hiera('myparam') 
} 

Im Knoten manifestieren zu platzieren sein. Das würde den Trick auch tun, aber wir entwickeln ein Modul, und Hauptmanifest ist außerhalb unseres Bereichs

+0

Ich kann das "undefined method" -Problem nicht ohne weiteres erklären, aber ich denke nicht, dass dieser Ansatz entweder (1) Sinn macht oder (2) für Sie funktionieren könnte, selbst wenn Sie den Hiera-Aufruf machen könnten. Hauptsächlich mit Letzterem zu sprechen, muss Ihr Typ sowohl auf dem Master * als auch auf dem Agenten * bewertet werden; Im letzteren Fall steht Ihnen (wahrscheinlich) kein Hiera zur Verfügung. –

+0

Für den zweiten Punkt verwenden wir eine Masterless-Architektur und verwenden Puppet-Apply, so dass Knoten Zugriff auf ihre Hiera-Informationen haben. Zum ersten werde ich versuchen, unseren Anwendungsfall in der Frage zu erklären –

Antwort

2

Sie können hiera Daten von einem Anbieter nicht zugreifen, weil ein Anbieter Agent-Seite läuft und Hiera Master-Seite ausgeführt wird.

Sie haben erwähnt, dass Sie Masterless in Ihren Kommentaren ausführen, dies ist irrelevant, da es immer noch einen "Master" -Run gibt, der den Puppet-Katalog kompiliert und Hiera-Werte auswertet und einen "Agenten" -Lauf, der den Katalog über Provider anwendet.

Man stelle sich die Puppen als eine Reihe von Schritten auszuführen:

  • Agent sendet Master eine Liste von Fakten
  • Meister die Website Manifest erstellt die Liste der Klassen zu finden, für den Knoten
  • Master umfassen wertet alle Parameter und Variablen hiera
  • Mastermodule in einen Katalog Katalog
  • Master sendet
  • Agent erstellt
  • Der Agent wendet den Katalog an, indem er die Parameter an die Provider eingibt.

Sie sollten also den Anbieter in einen Definitionstyp einschließen. Verwenden Sie die Klasse define, um die Standardwerte von hiera zu erhalten und sie an den Provider zu übergeben, während der Standardwert überschrieben werden kann.