Назначить узлы определенной иерархии hiera

#puppet #hiera #facter

#марионетка #hiera #фактор

Вопрос:

Я добавил в свой hiera.yaml иерархию, подобную этой

 - "nodes/%{::certname}"
- "locations/{::location}.yaml"
- "groups/%{::group}.yaml"
- common
  

Что касается узлов, я знаю, что hiera просматривает их через ресурс nodes. Но как это работает для местоположений или групп? Нужно ли мне создавать пользовательский факт? И если да, то как я могу присвоить узлу этот факт. Могу ли я сделать это в определении узла в site.pp следующим образом:

  node example.com{
    ::location = "new york"
    ::group = "mailer"  ... }
  

Ответ №1:

Что касается узлов, я знаю, что hiera просматривает их через ресурс nodes.

Я не уверен, что понимаю, что вы имеете в виду, но я думаю, что у вас недопонимание.

Но как это работает для местоположений или групп?

Интерполяция Hiera вставляет значения переменных Puppet и / или результаты определенных функций интерполяции. certname , location и group в этом отношении одинаковы, но certname переменная предоставляется Puppet автоматически на основе сертификата, предоставленного агентом для идентификации себя. (Это полностью ортогонально узловым блокам и конечным элементам узла, хотя они тоже используют имя сертификата.)

Нужно ли мне создавать пользовательский факт?

Вы можете сделать это таким образом, потому что все факты, представленные агентом, доступны как переменные Puppet верхнего уровня. Переменные, интерполируемые Hiera, не обязательно должны быть получены из фактов, но они должны быть определены до выполнения запросов Hiera, которые требуют их, и факты доступны построителю каталога до того, как он начнет оценивать манифест сайта.

И если да, то как я могу присвоить узлу этот факт.

Это полностью вопрос того, как вы реализуете этот факт.

Могу ли я сделать это в определении узла в site.pp[?]

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

 node example.com{
  $location = "new york"
  $group = "mailer"
  # ...
}
  

Для верхней области это то же самое, только за пределами блока node. В качестве альтернативы, вы можете определить переменные верхнего уровня (среди прочего) с помощью внешнего классификатора узлов.