Puppet: ключи хешей hiera, основанные на имени хоста, никогда не получают значение
Я использую хеш Hiera для хранения некоторых значений токенов, которые зависят от хоста. ключи внутри хеша соответствуют имени хоста / сертификату узла (ов), который будет классифицирован модулем профиля, который вызывает значение хеша. Однако когда я применяю модуль, значение, которое соответствует ключу хеш-функции для хоста, всегда равно нулю. Вот код, с которым я работаю.
в 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 показывает, что это допустимо синтаксически, но я считаю, что он обрабатывает '-' как маркер коллекции вместо буквального символа.
2 ответа
Ваш код правильный, я тестирую его, как показано ниже, кажется, он не нацелен на нужный файл yaml в вашей среде. Проверьте настройку иерархии и поставьте токен 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
root@ac976d6d79fb:~#
Я думаю, что 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.
Пожалуйста, проверьте также следующий пример:
# /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