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
Другие вопросы по тегам