Puppet 函数和YAML哈希查找

Puppet 函数和YAML哈希查找,puppet,hiera,Puppet,Hiera,我如何重写这个YAML,使其更加结构化,然后使用hiera函数在Puppet中引用它 目前,我正在使用hieradata语法,这种语法看起来非常简单,难以阅读 service::proxy::behind_reverse_proxy: true service::proxy::proxy_timeout: 300 service::proxy::serverlist: - host1.fqdn - host2.fqdn 例如,在params.pp文件中抓取了这些 $behind_rev

我如何重写这个YAML,使其更加结构化,然后使用hiera函数在Puppet中引用它

目前,我正在使用hieradata语法,这种语法看起来非常简单,难以阅读

service::proxy::behind_reverse_proxy: true
service::proxy::proxy_timeout: 300
service::proxy::serverlist:
  - host1.fqdn
  - host2.fqdn
例如,在params.pp文件中抓取了这些

$behind_reverse_proxy = hiera('service::proxy::behind_reverse_proxy', 'False')
$serverlist = hiera('service::proxy::serverlist')
我想我可以像这样重写YAML,让它更具可读性

service::proxy:
  behind_reverse_proxy: true
  proxy_timeout: 300
  serverlist:
    - host1.fqdn
    - host2.fqdn
并根据更新了params.pp文件

然而,在傀儡特工-t上,这导致了

服务器上出现错误400:在任何Hiera数据文件中找不到数据项service::proxy.serverlist,并且未提供默认值

我认为这些都是相关的

[user@server ~]$ facter -y | grep 'version'
facterversion: 2.4.4
puppetversion: 3.8.2

我从未使用过Hiera,但我认为问题在于,当需要映射哈希时,您有一个序列数组

在下面的YAML中,service::proxy key的值是一个包含三个元素的序列,每个元素都是一个包含一个键的映射:

service::proxy:
  - behind_reverse_proxy: true
  - proxy_timeout: 300
  - serverlist:
    - host1.fqdn
    - host2.fqdn
不过,您可能希望service::proxy成为具有三个键的映射:

service::proxy:
  behind_reverse_proxy: true
  proxy_timeout: 300
  serverlist:
  - host1.fqdn
  - host2.fqdn

您链接到的Hiera文档中的示例似乎支持这一点。

在我关于如何访问重组数据的评论之后:

在你的清单上,而不是这个

。。。您可以这样做:

$proxy_info = merge(
    { 'behind_reverse_proxy' => false, 'serverlist' => [] },
    hiera('service::proxy', {})
)
$behind_reverse_proxy = $proxy_info{'behind_reverse_proxy'}
$serverlist = $proxy_info{'serverlist'}

合并功能不是内置的,而是来自Puppet以前广泛使用的PuppetLabs。您很有可能已经在其他地方使用了该模块,但即使没有,将其引入堆栈也是值得的。

Hiera键/子键语法非常新。我必须仔细研究一下,以确定它是在什么时候被引入的,但至少您引用的文档页面没有对应于4.9.3之前的任何Puppet版本的页面。Puppet 3可以与Hiera的多个不同版本中的任何一个配对。你有哪个版本?我对木偶很陌生。我在哪里可以查到?在puppet代理或服务器上?哪个命令呢?如果您使用Hiera进行参数查找,那么通过params.pp将其分层是一个额外的失败点,没有附加值。另外,是否有任何东西阻止您使用受支持版本的Puppet?@cricket_007,Puppet支持JSON和YAML数组以及hiera数据中任意嵌套到任何深度的散列作为值。每个版本都允许您通过标量键检索这些值,并在检索后访问其内容。在Puppet 4通过Hiera的查找函数仅检索复合值的一部分之前,这是不受支持的,而这正是您要做的。您仍然可以重新构造未在自动数据绑定中使用的数据;你只需要改变你访问它们的方法。很好。让我看看当我删除序列时会发生什么。不幸的是,我得到了相同的错误更新问题,并更正了YAMLI,我相信我们确实包含了使用stdlib的问题。在Puppetfile中,有mod'puppetlabs/stdlib','4.6.0'注意,Puppet>=4中哈希合并的无stdlib解决方案是使用+哈希运算符:。
service::proxy:
  behind_reverse_proxy: true
  proxy_timeout: 300
  serverlist:
    - host1.fqdn
    - host2.fqdn
$behind_reverse_proxy = hiera('service::proxy.behind_reverse_proxy', 'False')
$serverlist = hiera('service::proxy.serverlist')
$proxy_info = merge(
    { 'behind_reverse_proxy' => false, 'serverlist' => [] },
    hiera('service::proxy', {})
)
$behind_reverse_proxy = $proxy_info{'behind_reverse_proxy'}
$serverlist = $proxy_info{'serverlist'}