Использование 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 отсутствуют и должны быть заменены вашими собственными)