-1

我为每个环境类型 dev、qa、集成创建了 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 type mismatch for key 'augeas_xml': expected Hash and got Array

主机特定设置不优先于环境特定设置。我给出的示例是针对一小组服务器。我正在使用 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'
4

1 回答 1

0

将 Augeas 命令和路径保留在数据文件之外并仅将重要的数据位(名称、位置和服务器地址)放入数据文件中会简单得多。Augeas 命令绝对是特定于实现的,而不是数据。

例如:

开发者.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 资源属性缺失,应替换为您自己的)

于 2016-10-07T07:39:12.237 回答