2016-06-10 15 views
0

Ich habe ein Problem mit Puppetdb und meine strukturierten Fakten (Hashes).puppetdb stringify strukturierte Fakten wie Hashes

Hashes wird durch meine puppetdb stringifiziert.

Ubuntu 14.04 
puppetserver  = 3.8.7 
facter   = 2.4.4 
puppetdb   = 2.3.8-1 

In meinem puppet.conf auf dem Clients und Server i gehört:

stringify_facts = false 

In meinem site.pp habe ich Eintrag folgenden:

if is_hash($::os) { 
    notify {'hash':} 
    notify {$os['family']:} 
    } 

    if is_string($::os) { 
    notify {'string':} 
    notify {$os['family']:} 
    } 

Wenn in meiner Puppe. conf auf dem Server:

storeconfigs   = true 
storeconfigs_backend = puppetdb 

und t er puppetdb läuft.

erhalte ich die folgende Meldung auf dem puppetrun Auftraggeber:

os is not a hash or Array when accesssing it with family. 

Wenn ich meine site.pp geändert nur:

if is_string($::os) { 
    notify {'os is a string':} 
    } 

Dann bekomme ich die Meldung -> ‚o ist eine Zeichenfolge '

Wenn ich ändern, um die puppet.conf auf meinem Server:

storeconfigs   = false 
storeconfigs_backend = puppetdb 

dann ist alles in Ordnung. os Tatsache wird als Hash identifiziert.

Hat jemand eine Idee? Bitte helfen :) Taner

+0

ich von 'is_hash' gehe davon aus, dass Sie mit' Puppet Labs-stdlib', richtig? Ich dachte, intrinsische Fakten seien im Allgemeinen keine Facetten mit Facter <3.0. Auch das hat wahrscheinlich keinen Effekt, aber warum wechselst du von os global ('$ :: os') zu os local (' $ os') in deiner 'site.pp'? –

+0

Danke für die Antwort. – mobios

+0

Danke für die Antwort Matt. $ :: os und $ os ist in meinem Manifest dieselbe Toplevel-Variable os. Ich habe keine Localscope-Variablen in diesem Beispiel. Ja, du bist richtig, die Methode "is_hash" stammt von puppetlabs-stdlib. Da facter 2.0 facter mit strukturierten Fakten umgehen kann, siehe https://docs.puppet.com/facter/2.2/fact_overview.html#writing-structured-facts. Und in meinem Problem, wenn ich die puppetdb deaktivieren, ist alles in Ordnung :(. Os wird als Hash identifiziert. – mobios

Antwort

0
if is_hash($::os) { 
    notify {'hash':} 
    notify {$os['family']:} 
} 

if is_string($::os) { 
    notify {'string':} 
    notify {$os['family']:} <-- this line is failing 
} 

Wenn Sie die puppetdb deaktivieren, dann ist die os Tatsache ein Hash und die erste bedingte Auslöser wird. Die Hash-Suche wird in dieser Situation korrekt mit $os['family'] durchgeführt.

Wenn puppetdb aktiviert ist und die Fakten 'stringifiziert' sind, wird die zweite Bedingung ausgelöst. Der Hash-Lookup $os['family'] schlägt fehl, weil os eine Zeichenfolge in dieser Situation und kein Hash ist. Sie müssen die Hash-Suche durch die Zeichenfolgensuche $::osfamily ersetzen.

Einige Seiteninformationen: https://github.com/puppetlabs/facter/blob/2.4.6/lib/facter/operatingsystem/base.rb#L11 https://github.com/puppetlabs/facter/blob/2.4.6/lib/facter/kernel.rb#L12

+0

Aber warum Fakten werden durch die pupetdb stringified?. Ich habe mein eigenes Fakt-Software-Inventar für Windows mit einem Namenspaket geschrieben. Diese Tatsache hat einen Rückgabewert als verschachtelten Hash. Rückgabewert ist zum Beispiel: apps = {'Notepad ++' => {Displayname '=>' Notepad ++ '' Displayversion '=>' 6.8.3 '}' Puppet (64-Bit) '=> {' Displayversion '=>' 3.8.6 '} 'und ich muss auf diese Tatsache als Hash und nicht als String zugreifen. Das Problem ist, dass ich nur dann auf die Faktenpakete zugreifen kann, wenn meine Puppetdb deaktiviert ist. Aber ich brauche meine Puppetdb. Die Frage ist, was kann ich tun, dass meine Puppetdb meine Hash-Fakten nicht stringifiziert. – mobios

+0

Wenn ich '$ os ['family'] == 'windows' {notify {'windows':}}' versuche und die puppetdb deaktiviert ist, bekomme ich eine Nachricht -> windows. Nach dem Aktivieren meiner Puppetdb wird der os Hash sofort angezeigt und ich erhalte eine Fehlermeldung. Ich muss strukturierte Fakten wie Hashes in meinen Manifesten verwenden. Code-Snippet, was ich in meinem Manifest aufnehmen werde, ist -> 'if $ packages ['Notepad ++'] ['Displayversion'] == '6.8.3'' Ich kann diesen Beispielcode nicht in meinem Manifest verwenden, da meine Fakten stringifiziert werden: ( – mobios

+0

Nun, das sind verschiedene Fragen mit ihren eigenen Antworten. Unsicher, wie Sie von hier fortfahren wollen. –