Использование hiera_hash для изменений augeas в куколке hiera

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

Hiera
|--host
|  |-dev1.internet.com
|  |-dev2.intranet.com
|--servertype
|  |-dev
|  |-qa

dev.yaml
augeas_xml:
  - 'set /root/node/servername/#text 'dev'
  - 'set /root/node/serverlocation/#text 'London'
  - 'set /root/node/ntp/#text '123.123.123.123'

dev1.internet.com.yaml
augeas_xml:
  - 'set /root/node/serverlocation/#text 'New York'
  - 'set /root/node/ntp/#text '123.123.123.125'

dev2.intranet.com.yaml
augeas_xml:
  - 'set /root/node/serverlocation/#text 'Accrington'

Мне нужен способ получить конфигурацию dev1.internet.com.yaml, чтобы иметь следующее

augeas_xml:
  - 'set /root/node/servername/#text 'dev'
  - 'set /root/node/serverlocation/#text 'New York'
  - 'set /root/node/ntp/#text '123.123.123.125'

hiera_array не дает мне желаемого результата, а hiera_hash выдает мне следующую ошибку: Несоответствие типов Hiera для ключа 'augeas_xml': ожидаемый хэш и полученный массив

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

---
:hierarchy:
  - "host/%{::fqdn}"
  - "server_type/%{server_type}"
  - default
:backends:
  - yaml
:yaml:
  :datadir: "/puppet/hieradata/%{::environment}"
:merge_behavior: deeper

Последний производит

    dev1.internet.com.yaml
    augeas_xml:
      - 'set /root/node/serverlocation/#text 'New York'
      - 'set /root/node/ntp/#text '123.123.123.125'
      - 'set /root/node/servername/#text 'dev'
      - 'set /root/node/serverlocation/#text 'London'
      - 'set /root/node/ntp/#text '123.123.123.123'

но я хочу это сделать

    dev1.internet.com.yaml
    augeas_xml:
      - 'set /root/node/servername/#text 'dev'
      - 'set /root/node/serverlocation/#text 'London'
      - 'set /root/node/ntp/#text '123.123.123.123'
      - 'set /root/node/serverlocation/#text 'New York'
      - 'set /root/node/ntp/#text '123.123.123.125'

1 ответ

Решение

Было бы намного проще сохранить команды и пути Augeas в ваших файлах данных и помещать только важные биты данных - имя, местоположение и адрес сервера - в файлы данных. Команды Augeas наиболее определенно зависят от реализации, а не от данных.

Например:

dev.yaml

servername: 'dev'
serverlocation: 'London'
ntp: '123.123.123.123'

dev1.internet.com.yaml

serverlocation: 'New York'
ntp: '123.123.123.125'

dev2.intranet.com.yaml

serverlocation: 'Accrington'

Тогда в вашем манифесте у вас есть что-то вроде этого:

$servername = hiera('servername')
$serverlocation = hiera('serverlocation')
$ntp = hiera('ntp')

augeas { 'node':
  context => '/files/root/node',
  changes => [
    "set servername/#text '$servername'",
    "set serverlocation/#text '$serverlocation'",
    "set ntp/#text '$ntp'",
  ],
}

(обратите внимание, что другие свойства ресурса Augeas отсутствуют и должны быть заменены вашими собственными)

Другие вопросы по тегам