在 hiera puppet 中使用 hiera_hash 进行 augeas 更改
Using hiera_hash for augeas changes in hiera puppet
我已经为每种环境类型 dev、qa、integration 创建了 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 给我以下错误:
键 'augeas_xml' 的 Hiera 类型不匹配:需要哈希并得到数组
主机特定设置未优先于环境特定设置。我给出的示例是针对一小组服务器的。我正在使用 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'
将 Augeas 命令和路径保留在数据文件之外并只放置 data 的重要部分 - 名称、位置和服务器地址会简单得多- 在数据文件中。 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 资源属性缺失,应替换为您自己的)
我已经为每种环境类型 dev、qa、integration 创建了 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 给我以下错误: 键 'augeas_xml' 的 Hiera 类型不匹配:需要哈希并得到数组
主机特定设置未优先于环境特定设置。我给出的示例是针对一小组服务器的。我正在使用 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'
将 Augeas 命令和路径保留在数据文件之外并只放置 data 的重要部分 - 名称、位置和服务器地址会简单得多- 在数据文件中。 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 资源属性缺失,应替换为您自己的)