Использование hiera для установки параметров класса?

Я пытаюсь понять, как использовать hiera для установки значений параметров класса. Я тестирую два простых класса: testhiera и testhiera2.

Вот эти классы:

[root@puppet-el7-001 modules]# cat testhiera/manifests/init.pp 
class testhiera (
        $haproxy_cert_content = 'unknown' ,
) {

        notify {"cert is $haproxy_cert_content":}
}
[root@-puppet-el7-001 modules]# cat testhiera2/manifests/init.pp 
class testhiera2 (
        $haproxy_cert_content = 'unknown' ,
) {

        notify {"number two cert is $haproxy_cert_content":}
}

вот мой файл /etc/pupletlabs/puppet/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: /root/puppetmaster/hiera/ost-el7

и у меня есть этот файл /root/puppetmaster/hiera/ost-el7/defaults.yaml

дополнительный вопрос: нужно ли называть файл defaults.yaml? Как я могу использовать другое имя файла?

---
testhiera::haproxy_cert_content: "\n
-----BEGIN CERTIFICATE-----\n
blah blah blha\n
-----END RSA PRIVATE KEY-----\n
blah blah blha\n
-----BEGIN CERTIFICATE-----\n
blah blah blha\n
-----END CERTIFICATE-----\n
"

Когда я выполняю свои кукольные классы вот так...

# puppet apply -e 'include testhiera'

... Я получаю ожидаемый результат:

Notice: Compiled catalog for puppet-el7-001.cisco.com in environment production in 0.08 seconds
Notice: cert is 
 -----BEGIN CERTIFICATE-----
 blah blah blha
 -----END RSA PRIVATE KEY-----
 blah blah blha
 -----BEGIN CERTIFICATE-----
 blah blah blha
 -----END CERTIFICATE-----

Notice: /Stage[main]/Testhiera/Notify[cert is 
 -----BEGIN CERTIFICATE-----
 blah blah blha
 -----END RSA PRIVATE KEY-----
 blah blah blha
 -----BEGIN CERTIFICATE-----
 blah blah blha
 -----END CERTIFICATE-----
 ]/message: defined 'message' as 'cert is 
 -----BEGIN CERTIFICATE-----
 blah blah blha
 -----END RSA PRIVATE KEY-----
 blah blah blha
 -----BEGIN CERTIFICATE-----
 blah blah blha
 -----END CERTIFICATE-----
 '
Notice: Finished catalog run in 0.17 seconds

Мой вопрос: как лучше всего передать данные haproxy_cert_content в класс testhiera2? Должен ли я изменить файл defaults.yaml, чтобы он выглядел так...

---
testhiera::haproxy_cert_content: "\n
-----BEGIN CERTIFICATE-----\n
blah blah blha\n
-----END RSA PRIVATE KEY-----\n
blah blah blha\n
-----BEGIN CERTIFICATE-----\n
blah blah blha\n
-----END CERTIFICATE-----\n
"
testhiera2::haproxy_cert_content: "\n
-----BEGIN CERTIFICATE-----\n
blah blah blha\n
-----END RSA PRIVATE KEY-----\n
blah blah blha\n
-----BEGIN CERTIFICATE-----\n
blah blah blha\n
-----END CERTIFICATE-----\n
"

... в основном просто вырезали и вставляли строки и меняли testhiera на testhiera2?

Я надеюсь, что кто-то может показать мне лучший способ сделать это.

Спасибо


person Red Cricket    schedule 17.02.2015    source источник


Ответы (1)


В Hiera вы можете повторно использовать уже определенные переменные с помощью поиска Hiera. функция. В вашем примере это будет:

testhiera2::haproxy_cert_content:"%{hiera('testhiera::haproxy_cert_content')}"

Побочный вопрос: Hiera будет искать переменные в файлах в том же порядке, что и в hiera.yaml. (читая о hiera иерархии). Итак, в вашей конфигурации сначала будет проверьте файл defaults.yaml. Если он не найдет там определенную переменную, он попытается оценить переменную clientcert и посмотреть в файле value_of_clientcert.yaml, затем в файле value_of_environment.yaml и в конце в global.yaml.

Вам не нужно называть файл defaults.yaml. Все, что будет соответствовать конфигурации hiera, согласно описанию выше, будет хорошо.

* Кстати, если вы используете факты в иерархии hiera, поставьте :: перед именем переменной, то есть %{::facter_fact}.

person kkamilpl    schedule 17.02.2015
comment
Обратите особое внимание на то, что при такой иерархии defaults имеет приоритет над любыми настройками в других местах, что противоречит здравому смыслу. Вы можете переименовать этот слой в absolutes или immutables или вообще не удалять его. %{clientcert} обычно является безопасным выбором для верхнего уровня иерархии. - person Felix Frank; 17.02.2015
comment
Хорошее наблюдение. Сохранение defaults в качестве вершины иерархии hiera противоречит здравому смыслу. Моя иерархия иерархии выглядит так: ` - %{::my_environment}/%{::hostname} -%{::my_environment}/defaults - defaults ` - person kkamilpl; 17.02.2015