2015-05-29 1 views
1

Я использую хеш-символ Hiera для хранения некоторых значений токена, которые зависят от узла. ключи в хеш соответствуют имени хоста/certname узла (ов), которые будут классифицированы с модулем профиля, который вызывает хеш-значение. Однако, когда я применяю модуль, значение, соответствующее хэш-ключу для хоста, всегда равно нулю. Вот код, с которым я работаю.Куколка: ключи хеширования на основе имени хоста никогда не извлекают значение

в hiera-file.yaml

token_lookup: 
    host-name1: 'abcdef123' 
    host-name2: 'abbcde456' 

и profile.pp

$_tokens = hiera_hash('token_lookup', undef, 'hiera-file') 
$_specific_token = $_tokens["${::hostname}"]  <== never gets a value 

Я уверен, что имя хоста соответствует ключу в хэш. Вопрос в том, какой правильный синтаксис здесь для правильного заполнения значения из файла hiera? Заранее благодарю вас за совет.

Редактировать: Я считаю, что я обнаружил проблему, когда хэш-ключ имеет буквальный символ «-» в нем, как это делают многие имена хостов. Я обновил хэш, чтобы показать ключи с тире в нем, и теперь должен задать более конкретный вопрос: я вижу десятки статей о том, как избежать символов в значениях хэшей, используя двойные кавычки, но я ничего не вижу - даже на yaml.org - о том, как избежать символа, если он отображается как часть ключа. Любые советы по этой проблеме? Парсер YAML показывает, что это допустимо синтаксически, но я считаю, что он обрабатывает «-» как маркер коллекции, а не буквенный символ.

+1

вы убедились, что файл используется на всех? Что вы собираете * любые * данные? Вы запускали с включенным режимом отладки? Использовал CLI 'hiera' для отладки? –

+0

Да, остальные функции нормального поиска отлично работают; это только тот, который не заполняется, как я ожидал. Попробуем hier CLI - оцените подсказку – Patrick

+0

Вы пробовали процитировать хеш-ключи? –

ответ

0

Я думаю, hiera_hash не то, что вы хотите.

hiera_hash: использует хэш слияния поиска. Ожидает, что каждое значение в иерархии для заданного ключа будет хешем и объединяет ключи верхнего уровня в каждом хэше в один хеш. Обратите внимание, что это не делает глубокое слияние в случае вложенных структур.

Изменение:

$_tokens = hiera_hash('token_lookup', undef, 'hiera-file') 

в

$_tokens = hiera('token_lookup', {}) #it will create empty hash if it couldn't find 'token_lookup' variable. 

Пожалуйста, проверьте следующее example:

# /etc/puppet/hieradata/appservers.yaml 
--- 
proxies: 
    - hostname: lb01.example.com 
    ipaddress: 192.168.22.21 
    - hostname: lb02.example.com 
    ipaddress: 192.168.22.28 

# Get the structured data: 
$proxies = hiera('proxies') 
# Index into the structure: 
$use_ip = $proxies[1]['ipaddress'] # will be 192.168.22.28 
+0

Правильно, пример представляет собой массив хэшей. К вложенным значениям доступа относится ключевое имя - это то же самое, что и я, за исключением того, что у меня есть токен интерполяции в качестве ключа для поиска. Я попытался использовать функцию поиска приоритета 'hiera' вместо хеш-слияния и получил тот же результат, что и слияние хешей. – Patrick

2

Ваш код правильный, я проверить его, как показано ниже, кажется, что это Бесполезный 't нацелить правый файл yaml в вашем enviro nment. Проверьте настройку иерархии и поместите токен key-value в нужное место.

Если я положил файл YAML в global.yaml (Если hiera не может найти ключ, он всегда будет идти до последнего в моей установке hiera.yaml)

Я перестроил его с простейшей настройки:

$ cat /etc/hiera.yaml: 

--- 
:backends: 
    - yaml 
:hierarchy: 
    - defaults 
    - "%{clientcert}" 
    - "%{environment}" 
    - global 

:yaml: 
# datadir is empty here, so hiera uses its defaults: 
# - /var/lib/hiera on *nix 
# - %CommonAppData%\PuppetLabs\hiera\var on Windows 
# When specifying a datadir, make sure the directory exists. 
    :datadir: 

$ cat /var/lib/hiera/global.yaml 
token_lookup: 
    host-name1: 'abcdef123' 
    host-name2: 'abbcde456' 

$ cat profile.pp 
$_tokens = hiera_hash('token_lookup', undef, 'hiera-file') 
notice ("tokens is $_tokens") 
$_specific_token = $_tokens["${::hostname}"] 
notice ("token is $_specific_token ") 

Тогда я бегу puppet apply, я могу видеть результат

$ FACTER_hostname='host-name1' puppet apply profile.pp --hiera_config /etc/hiera.yaml 
Notice: Scope(Class[main]): tokens is host-name1abcdef123host-name2abbcde456 
Notice: Scope(Class[main]): token is abcdef123 
Notice: Compiled catalog for host-name1 in environment production in 0.04 seconds 
Notice: Finished catalog run in 0.07 seconds 

$ FACTER_hostname='host-name2' puppet apply profile.pp --hiera_config /etc/hiera.yaml 
Notice: Scope(Class[main]): tokens is host-name1abcdef123host-name2abbcde456 
Notice: Scope(Class[main]): token is abbcde456 
Notice: Compiled catalog for host-name2 in environment production in 0.04 seconds 
Notice: Finished catalog run in 0.02 seconds 
[email protected]:~# 
+0

спасибо за проверку работоспособности; У меня нет доступа к мастеру, но другие переменные в модуле получают свои значения из одного и того же файла hiera и читаются правильно, поэтому я убежден, что компиляция каталога находит правильный файл yaml. Я продолжу отладку; согласитесь, что это должно – Patrick

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