2016-11-15 2 views
2

Ich arbeite eine Struktur für meine Web-Servern auf den Aufbau. Ich habe meine Einstellung in Hiera, aber ich kann nicht scheinen, Marionette zu bekommen, um die richtigen Typen zurückzugeben.Iterate über einen tief verschachtelten hiera Hash in puppet manifest

In common.yaml

vhosts: 
    hostname: 
    sitename: 
     app_url: value 
     app_type: value 

habe ich mehrere Websites pro vhost und mehrere vhosts. In meinem Manifest werde ich die Ordnerstruktur und andere Setup-Aufgaben erstellen, aber für jetzt kann ich nicht einmal über die Websites iterieren.

Aktuelle Manifest:

define application($app_name, $app_url) { 
    notice("App Type: ${app_type}") 
    notice("App Url: ${app_url}") 
} 

$vhosts = hiera('vhosts') 

$vhosts.each |$vhost| { 
    create_resources(application, $vhost) 
} 

Der Fehler, den ich bekommen ist, dass create_resources einen Hash erfordert. Allerdings, wenn ich Cast $vhost eingeben, bekomme ich, dass es kein Hash, sondern ein Tupel ist.

Wie bin ich einen Tuple aus meinem yaml Hash? Gibt es einen besseren Weg, um über diesen Datensatz zu iterieren, um zu bekommen, was ich brauche?

Antwort

4

Warum Sie hatte ein Tupel bei https://docs.puppet.com/puppet/latest/reference/function.html#each im zweiten Beispiel erläutert.

ein Hiera Hash Gegeben wie:

vhosts: 
    hostname: 
    sitename: 
     app_url: value 
     app_type: value 

Sie darüber, wie die folgende laufen kann:

hiera_hash('vhosts').each |String $hostname, Hash $hostname_hash| { 
    # $hostname is 'hostname' 
    # $hostname_hash is { hostname => { sitename => { app_url => value, app_type => value } } } 
    $hostname_hash.each |String $sitename, Hash $sitename_hash| { 
    # $sitename is 'sitename' 
    # $sitename_hash is { sitename => { app_url => value, app_type => value } } 
    $sitename_hash.each |String $key, String $value| { 
     # first loop $key is app_url and $value is 'value' 
     # second loop $key is app_type and $value is 'value' 
    } 
    } 
} 

Sie können natürlich, Zugang Hash-Werte an jedem Punkt wie

hiera_hash('vhosts')['hostname']['sitename']['app_url'] 

, die in value führen.

Wenn Sie versuchen, create_resources() zu tun, dann möchten Sie wahrscheinlich den Hash als Hash von Ressource-Hashes konstruieren. Zum Beispiel Hiera:

packages: 
    gcc: 
    ensure: installed 
    gfortran: 
    ensure: absent 

mit Puppet:

create_resources(hiera_hash('packages')) 
Verwandte Themen