在hiera puppet中使用hiera_哈希进行augeas更改

在hiera puppet中使用hiera_哈希进行augeas更改,puppet,hiera,augeas,Puppet,Hiera,Augeas,我已经为每种环境类型创建了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/server

我已经为每种环境类型创建了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_数组没有给出所需的结果,hiera_哈希给了我以下错误: 键“augeas_xml”的Hiera类型不匹配:应为哈希和get数组


特定于主机的设置没有优先于特定于环境的设置。我给出的示例是针对一小部分服务器的。我正在使用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命令和路径保留在数据文件之外,只将重要的数据位(名称、位置和服务器地址)放在数据文件中会简单得多。Augeas命令绝对是特定于实现的,而不是数据

例如:

戴夫·亚马尔

servername: 'dev'
serverlocation: 'London'
ntp: '123.123.123.123'
dev1.internet.com.yaml

serverlocation: 'New York'
ntp: '123.123.123.125'
serverlocation: 'Accrington'
dev2.intranet.com.yaml

serverlocation: 'New York'
ntp: '123.123.123.125'
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资源属性丢失,应该由您自己的属性替换)

hiera\u hash
在这里没有用处,因为您确实在创建数组。那么
hiera_数组
的结果是不需要的呢?请显示它正在生成的输出,以及出现问题的原因。特定于主机的设置没有优先于特定于环境的设置。我给出的示例是针对一小部分服务器的。我正在使用puppet管理数百台服务器。我可以使用hiera为每个主机创建一个yaml文件。但是,我希望有一个default.yaml并能够覆盖主机中的更改。yaml请将您的hiera.yaml添加到问题中,并更准确地显示您正在描述的文件的位置-顶部是目录结构还是逻辑结构?
hiera\u array
的合并行为是将最具体的放在第一位,如果你想反转它,这样它就覆盖了现有的值,我想你应该考虑我现有的答案,不依赖于合并。它将覆盖Hiera而不是Augeas中的值。或者,对hiera查找结果使用stdlib的reverse()函数。