【问题标题】:hiera() function and YAML hash lookupshiera() 函数和 YAML 哈希查找
【发布时间】:2017-07-06 18:55:55
【问题描述】:

如何重写这个 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文件

$behind_reverse_proxy = hiera('service::proxy.behind_reverse_proxy', 'False')
$serverlist = hiera('service::proxy.serverlist')

但是在puppet agent -t 导致

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


我认为这些是相关的

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

【问题讨论】:

  • Hiera 键/子键语法相当新。我必须四处摸索才能确定它是何时引入的,但至少您引用的文档页面在 4.9 之前的任何 Puppet 版本中都没有相应的页面。
  • Puppet 3 可以与多个不同版本的 Hiera 中的任何一个配对。你有哪个版本?
  • 我对 Puppet 很陌生。我在哪里检查?在傀儡代理还是服务器上?哪个命令?
  • 如果您使用 Hiera 进行参数查找,那么通过 params.pp 分层是一个额外的故障点,没有附加价值。另外,是否有任何事情阻止您使用受支持的 Puppet 版本?
  • @cricket_007,Puppet 支持 JSON 和 YAML 数组以及分层数据中的散列,可以任意嵌套到任何深度,作为 。每个版本都允许您通过它们的(标量)键检索这些值,并在检索后访问它们的内容。在 Puppet 4 仅通过 Hiera 的查找函数检索复合值的 part 之前,没有得到很好的支持,这就是您正在尝试做的事情。您仍然可以重组数据(未用于自动数据绑定);你只需要改变你访问它们的方法。

标签: puppet hiera


【解决方案1】:

跟进我关于如何访问重组数据的评论:

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'}

merge() 函数不是内置的,而是来自 Puppet(原 PuppetLabs)广泛使用的 stdlib module。您很有可能已经在其他地方使用该模块,但即使没有,也值得您花时间将其引入您的堆栈。

【讨论】:

【解决方案2】:

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

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

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 文档中的示例似乎支持这一点。

【讨论】:

  • 好收获。让我看看删除序列后会发生什么。
  • 不幸的是,我得到了同样的错误(用更正的 YAML 更新问题)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 2018-06-14
  • 1970-01-01
相关资源
最近更新 更多