2016-07-17 12 views
0

Ich habe dies in einer YAML Hiera-Datei.Marionette: Iterate über ein Hiera_hash in Vorlage

reg_connection: 
    toronto: 
    - host: apple.net 
    - port: 701 
    - user: george 
    - ssl: true 
    - allowed: banana,orange 
    texas: 
    - host: pink.net 
    - port: 702 
    - user: joel 
    - ssl: false 
    - allowed: blue,gree,red 

Ich möchte die Werte der Host, Port, Benutzer, ssl und für Toronto und Texas zugreifen dürfen.

Ich habe dies in meinem Manifest:

$reg_connection= hiera_hash('reg_connection') 

Ich habe dies in meiner Vorlage:

<% reg_connection.keys().sort.each do |location| -%> 
<%= location %>host=<%= location[host] %> 
<%= location %>port=<%= location[port] %> 
<%= location %>username=<%= location[user] %> 
<%= location %>ssl.enable=<%= location[ssl] %> 
<%= location %>allowed.list=<%= location[allowed] %> 
<% end -%> 

ich diese zwei Blöcke von Konfiguration in meiner Vorlage ausgegeben werden soll: ein für Toronto und eine für Texas.

Meine Puppe Ausgabe zeigt, dass es keinen Wert für Host hat. Wie kann ich auf diesen Wert zugreifen?

+0

Beachten Sie, dass der Punkt von 'hiera_hash()' ist, eine * Hash-Merge * -Lookup durchzuführen. Die Daten und Ergebnisse sind notwendigerweise Hashes, aber nur weil Ihr Wert ein Hash ist, bedeutet das nicht, dass Sie 'hiera_hash()' brauchen oder wollen. Die gewöhnliche 'hiera()' -Funktion führt stattdessen eine Suche mit Standardpriorität durch und gibt einen Hash zurück, wenn dies tatsächlich der Typ des Wertes ist, der entdeckt wird. –

Antwort

6

Sie haben eine Reihe von Problemen. Der erste ist, dass in diesem Code:

<%= location[host] %> 

... host ist (korrekt) als lokale Variable oder Methodennamen interpretiert. Es gibt keine Variable oder Methode namens host, daher der Fehler.

Sie möchten auf den Wert mit dem Schlüssel "host" zugreifen, der eine Zeichenfolge ist, also müssen Sie diese Zeichenfolge verwenden.

<%= location["host"] %> 

Das zweite Problem ist in Ihrer YAML-Datei.

reg_connection: 
    toronto: 
    - host: apple.net 
    - port: 701 
    - user: george 
    - ssl: true 
    - allowed: banana,orange 
    texas: 
    # ... 

Hier haben Ihre eine Abbildung (das ist gleich und in-einem Ruby-Hash analysiert) mit einem einzigen Schlüssel, reg_connection. Der diesem Schlüssel zugeordnete Wert ist selbst eine Zuordnung mit zwei Schlüsseln, toronto und texas. So weit, ist es gut. Aber der Wert, der toronto zugeordnet ist, ist eine Sequenz (lesen: Array), keine Zuordnung, da jede Zeile mit beginnt. Das Mapping hat fünf Elemente, von denen jedes einen einzelnen Schlüssel und Wert hat. Eine andere Möglichkeit, die gleiche Datenstruktur darzustellen, ist dies, was zur Veranschaulichung des Problems beitragen kann.

{ reg_connection: 
    { toronto: 
    [ { host: apple.net }, 
     { port: 701 }, 
     { user: george }, 
     # ... 
    ], 
    texas: 
     # ... 
    } 
} 

Was Sie wollen, nehme ich an, ist für diese Struktur innerste Daten eine Zuordnung zu sein, nicht eine Folge:

reg_connection: 
    toronto: 
    host: apple.net 
    port: 701 
    user: george 
    ssl: true 
    allowed: banana,orange 
    texas: 
    # ... 

Das dritte Problem ist mit der Art und Weise Sie versuchen, über iterieren die sich daraus ergebenden Hashes:

<% reg_connection.keys().sort.each do |location| -%> 
<%= location %>host=<%= location["host"] %> 
<%= location %>port=<%= location["port"] %> 
... 

Sie reg_connection.keys.sort.each (Anmerkung: in idiomatische Ruby Klammern sind für leere Argumentlisten weggelassen) genannt haben, was bedeutet, dass Sie nicht über die Standorte laufen, yo Sie durchlaufen die Schlüssel des reg_connection Hash. Mit anderen Worten, Sie durchlaufen das Array ["toronto", "texas"], sodass die folgende Zeile "toronto"["host"] entspricht, was nicht funktionieren wird.

Sie könnte ersetzen location["host"] mit reg_connection[location]["host"], aber das ist übertrieben.Genau dies tut:

<% reg_connection.sort.each do |location, values| -%> 
<%= location %>host=<%= values["host"] %> 
<%= location %>port=<%= values["port"] %> 
... 

Es gibt keine Notwendigkeit reg_connection ‚s Schlüssel zu erhalten, bevor sort Aufruf -Sie kann es direkt auf dem Hash nennen. Dadurch wird der Hash-Wert in ein Array von Schlüssel/Wert-Paaren (Arrays mit zwei Elementen) konvertiert, die Ruby problemlos sortieren kann. Dann, wenn wir each anrufen, werden zwei Werte an den Block location (sie Schlüssel, zum Beispiel "toronto") und values der Hash mit "host", "port" usw. Schlüssel übergeben.

+0

sehr didaktisch. vielen Dank. – RASG