Я решил переключиться с одного файла по умолчанию nodes.pp на серверную часть Hiera, чтобы управлять узлами в Puppet и назначать модули узлам.
Мы используем имена хостов как таковые:
nyc-apache-prod-01
was-mysql-tst-01
Это наша структура каталогов hiera.yaml и hierdata:
# cat hiera.yaml
:backends:
- yaml
:hierarchy:
- environment/tst/%{::hostname}
- environment/tst
- %{::osfamily}
- common
:logger: console
:yaml:
:datadir: '/etc/puppet/hieradata'
# find hieradata
hieradata
hieradata/RedHat.yaml
hieradata/OracleRAC.yaml
hieradata/common.yaml
hieradata/environment
hieradata/environment/dev
hieradata/environment/tst.yaml
hieradata/environment/acc
hieradata/environment/dev.yaml
hieradata/environment/acc.yaml
hieradata/environment/tst
hieradata/environment/tst/nyc-ks-tst-02.yaml
hieradata/environment/tst/nyc-ks-tst-01.yaml
hieradata/environment/prd
hieradata/environment/prd.yaml
Проблема в том, что среды должны быть установлены как environment = tst в /etc/puppet/puppet.conf на каждом отдельном узле. Я мог бы написать модуль для этого на основе имени хоста сервера, но я не уверен, что это лучший способ организовать серверы в отдельных средах.
Чего я хочу избежать, так это добавления списка классов в список классов для каждого отдельного сервера. Именно по этой причине мы в первую очередь перешли с single node.pp на серверную часть Hiera.
Возможно, вы захотите назначить роль серверам и использовать ее для предоставления им пакетов.
Например; в /etc/facter/facts.d вы помещаете файл, который устанавливает факт роли. Вы можете использовать это как уровень иерархии Hiera для назначения модулей серверам.
Сам никогда не пробовал, но думаю, может сработать .. :)