Назад | Перейти на главную страницу

Поиск Hiera по шаблону

Я пытаюсь понять, как я могу перейти от того, что я делаю в моем большом файле site.pp, к структуре, которую я могу использовать в hiera. Мне неясно, читая марионеточные документы, как именно оцениваются данные hiera и когда они вписываются в картинку. Я недавно обновил марионетку 2.7.x до 3.3.x. Это включает hiera как часть стандартного пакета, поэтому я хотел наконец взглянуть на его использование, поскольку оно должно упростить мою установку для чтения / понимания.

Я использую для поддержки систем нескольких сторонних организаций. Это включает настройку систем, уникальных для каждой организации. В верхней части моего site.pp у меня есть структура, как показано ниже. Который я использую для установки фактов для каждой организации на основе регулярного выражения, которое соответствует факту clientcert, который настроен и выпущен таким образом, чтобы они надежно идентифицировали каждую организацию.

# match organization
case $::clientcert {

  /.*example1.org/ :
      { $snmp_ro_community='...'
        $snmp_location='Example Org 1' 
        ... }
  /.*example2.org/ :
      { $snmp_ro_community='...'
        $snmp_location='Example Org 2' 
        ... }
  /.*example3.org/ :
      { $snmp_ro_community='...'
        $snmp_location='Example Org 3' 
        ... }
  /.*example4.org/ :
      { $snmp_ro_community='...'
        $snmp_location='Example Org 4' 
        ... }
}

Я просматриваю примеры и не вижу никакого способа выполнить какое-либо сопоставление с образцом в моем файле hiera.yaml. Хотя я подозреваю, что упускаю что-то очевидное.

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

Я искал то же самое по той же причине. и обнаружили, что hiera backedn в github полезно jjulien / hiera-regex . В качестве примера из файла readme самого проекта: вам нужно настроить новый бэкэнд, который имеет дело с группировкой, как в:

/etc/puppet/hiera.yaml:

:backends:
  - regex
  - yaml
:yaml:
  :datadir: /var/lib/hiera
:regex:
  :datadir: /var/lib/hiera
:hierarchy:
  - "fqdn/%{::fqdn}"
  - common

/var/lib/hiera/fqdn/fqdn.regex:

---
 - '^mailin-trusted.example.org$':
     postfix::smtp_relay: 'mailout-dmz.example.org'
 - '^mailout.*':
     postfix::smtp_relay: 'smtp.mailgun.org'
 - '^mailin.*':
     postfix::smtp_relay: 'localhost'

однако я вижу, что несколько сообщений о марионеточных пользователях и видео о марионеточных лабораториях предупреждают о недопустимости использования hiera для классификации, особенно сейчас, с выпуском PE 3.7 с диспетчером узлов.

Для этого вы можете настроить иерархию файлов YAML. Давайте начнем с hiera.yaml:

---
:hierarchy:
    - "host/%{fqdn}"
    - "domain/%{domain}"
    - "env/%{::environment}"
    - "ops/%{operatingsystem}"
    - "os/%{osfamily}"
    - common
:backends:
    - yaml
:yaml:
    :datadir: /etc/puppet/data

Для структуры папок вы можете использовать любой факт, который вы видите в выводе facter -y. например у вас могут быть файлы конфигурации hiera для каждой архитектуры процессора. Затем вы должны добавить строку

- "arch/%{::architecture}"

И Хиера заглянула, скажем так, в arch/amd64.yaml

Для отладки hiera вы можете сбросить свои текущие факты:

   $ facter -y > myhost.yaml

И ищите какую-нибудь переменную:

   $ hiera -y myhost.yml snmp_location --debug

Хиера выполнит все правила и попытается найти переменную:

DEBUG: Mon Nov 11 11:00:23 +0100 2013: Hiera YAML backend starting
DEBUG: Mon Nov 11 11:00:23 +0100 2013: Looking up snmp_location in YAML backend
DEBUG: Mon Nov 11 11:00:23 +0100 2013: Looking for data source host/myhost.example.com
...
DEBUG: Mon Nov 11 11:00:23 +0100 2013: Looking for data source ops/Ubuntu
DEBUG: Mon Nov 11 11:00:23 +0100 2013: Cannot find datafile /etc/puppet/data/ops/Ubuntu.yaml, skipping

Для сопоставления $::clientcert было бы неплохо выделить верхний домен в отдельный факт, а затем просто иметь файлы yaml для cert/example1.org.yaml который будет содержать что-то вроде этого:

---
snmp_location: 'Example Org 1'

Полезно знать, что даже если у вас есть модуль, который вообще не содержит вызова функции hiera, вы можете легко настроить значения параметров:

class snmp (
  $location = 'foo',
) { 
# ...
}

некоторая конфигурация hiera:

---
snmp::location: 'Example Org 1'