2016-06-10 5 views
0

У меня проблема с кукольным делом и мои структурированные факты (хеши).puppetdb строит структурированные факты, такие как хэши

Хеши будут изрезаны через мой кукольный театр.

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

В моей puppet.conf на клиентах и ​​сервере я включил:

stringify_facts = false 

В моем site.pp я после вступления:

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

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

Если в моей марионетке. conf на сервере:

storeconfigs   = true 
storeconfigs_backend = puppetdb 

и t он марионетку работает.

я получаю следующее сообщение на клиенте puppetrun:

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

Если я изменил мой site.pp к только:

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

Тогда я получаю сообщение -> «ОС является строкой '

Если я изменить puppet.conf на моем сервере, чтобы:

storeconfigs   = false 
storeconfigs_backend = puppetdb 

тогда все в порядке. os будет идентифицирован как хэш.

У кого-нибудь есть идея? Пожалуйста, помогите :) Танер

+0

Я предполагаю, что из 'is_hash', что вы используете' puppetlabs-stdlib', правильно? Я думал, что внутренние факты не были хешей вообще с Facter <3.0. Кроме того, это, вероятно, не имеет никакого эффекта, но почему вы переходите из os global ('$ :: os') в os local (' $ os') в свой 'site.pp'? –

+0

Спасибо за ответ. – mobios

+0

Спасибо за ответ Matt. $ :: os и $ os в моей манифесте имеет ту же самую переменную os. В этом примере у меня нет переменных localscope. Да, вы правы, метод «is_hash» - от марионетки-stdlib. Поскольку facter 2.0 facter может обрабатывать структурированные факты, см. Здесь https://docs.puppet.com/facter/2.2/fact_overview.html#writing-structured-facts. И в моей проблеме, если я деактивирую puppetdb, все в порядке :(os будет идентифицироваться как хэш. – mobios

ответ

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

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

При отключении puppetdb, то os факт становится хэш и первые условные триггеры. В этом случае поиск хэша выполняется правильно с $os['family'].

Когда кукольный театр включен, а факты «стягиваются», тогда запускается второе условие. Поиск хэша $os['family'] не удастся, потому что os является строкой в ​​этой ситуации, а не хешем. Вам нужно заменить хэш-поиск на строку поиска $::osfamily.

Некоторые побочная информация: 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

Но почему факты будут стягиваться через куклу? ». Я написал свой собственный файл softwareinventory для окон с именами пакетов. Этот факт имеет возвращаемое значение как вложенный хеш. Например, returnvalue: 'apps = {'Notepad ++' => {displayname '=>' Notepad ++ '' DisplayVersion '=>' 6.8.3 '}' Puppet (64-bit) '=> {' DisplayVersion '=>' 3.8.6 '} ', и мне нужно получить доступ к этому факту как к хэшу, а не как к строке. Проблема в том, что я могу получить доступ к пакетам факсов только как хэш, если мой puppetdb отключен. Но мне нужен мой puppetdb. Вопрос в том, что я могу сделать, чтобы мой кукольный театр не стягивал мои хэш-факты. – mobios

+0

Если я попробую '$ os ['family'] == 'windows' {notify {'windows':}}', и puppetdb деактивирован, я получаю сообщение -> windows. После активации моего puppetdb os hash немедленно будет сжат, и я получу ошибку. Я должен использовать структурированные факты, такие как хэши в моих проявлениях. Фрагмент кода, который я буду включать в мой манифест, -> 'if $ packages ['Notepad ++'] ['DisplayVersion'] == '6.8.3'' Я не могу использовать этот пример кода в своем манифесте, потому что мои факты будут сжаты: ( – mobios

+0

Ну, это разные вопросы с их собственными наборами ответов. Непонятно, как вы можете исходить отсюда. –

 Смежные вопросы

  • Нет связанных вопросов^_^