【问题标题】:Puppet: Iterate over a hiera_hash in templatePuppet:迭代模板中的 hiera_hash
【发布时间】:2016-11-20 09:38:58
【问题描述】:

我在 yaml hiera 文件中有这个。

reg_connection:
  toronto:
    - host: apple.net
    - port: 701
    - user: george
    - ssl: true
    - allowed: banana,orange
  texas:
    - host: pink.net
    - port: 702
    - user: joel
    - ssl: false
    - allowed: blue,gree,red

我想访问 host、port、user、ssl 的值,并允许 toronto 和 texas。

我的清单中有这个:

 $reg_connection= hiera_hash('reg_connection')

我的模板中有这个:

<% reg_connection.keys().sort.each do |location| -%>
<%= location %>host=<%= location[host] %>
<%= location %>port=<%= location[port] %>
<%= location %>username=<%= location[user] %>
<%= location %>ssl.enable=<%= location[ssl] %>
<%= location %>allowed.list=<%= location[allowed] %>
<% end -%>

我希望它在我的模板中输出两个配置块:一个用于多伦多,一个用于德州。

我的 puppet 输出显示它没有主机值。我如何访问该值?

【问题讨论】:

  • 请注意hiera_hash() 的目的是执行hash-merge 查找。数据和结果必然是散列,但仅仅因为您的值预计是散列并不意味着您需要或想要hiera_hash()。普通的hiera() 函数将改为执行标准优先级查找,如果这实际上是它发现的值的类型,它将返回一个哈希。

标签: ruby hash puppet erb hiera


【解决方案1】:

你有很多问题。第一个是在这段代码中:

<%= location[host] %>

...host 被(正确地)解释为局部变量或方法名称。没有名为host 的变量或方法,因此出现错误。

您想使用名为"host" 的键访问值,该键是一个字符串,因此您必须使用该字符串。

<%= location["host"] %>

第二个问题出在你的 YAML 文件中。

reg_connection:
  toronto:
    - host: apple.net
    - port: 701
    - user: george
    - ssl: true
    - allowed: banana,orange
  texas:
    # ...

在这里,您有一个映射(类似于 - 并被解析为 - Ruby 哈希),具有单个键 reg_connection。与该键关联的值本身就是具有两个键torontotexas 的映射。到目前为止,一切都很好。但是与toronto 关联的值是一个序列(读取:数组),而不是映射,因为每一行都以- 开头。该映射有五个项目,每个项目都有一个键和值。表示相同数据结构的另一种方法是this,这可能有助于说明问题;

{ reg_connection:
  { toronto:
    [ { host: apple.net },
      { port: 701 },
      { user: george },
      # ...
    ],
    texas:
      # ...
  }
}

我怀疑,你想要的是最里面的数据结构是一个映射,而不是一个序列:

reg_connection:
  toronto:
    host: apple.net
    port: 701
    user: george
    ssl: true
    allowed: banana,orange
  texas:
    # ...

第三个问题是您尝试迭代生成的哈希的方式:

<% reg_connection.keys().sort.each do |location| -%>
<%= location %>host=<%= location["host"] %>
<%= location %>port=<%= location["port"] %>
...

您调用了reg_connection.keys.sort.each(注意:在惯用的 Ruby 中,空参数列表省略了括号),这意味着您不是在迭代位置,而是在迭代 reg_connection 哈希的键.换句话说,您正在遍历数组["toronto", "texas"],因此后续行等价于"toronto"["host"],这是行不通的。

可以location["host"] 替换为reg_connection[location]["host"],但这太过分了。只需这样做:

<% reg_connection.sort.each do |location, values| -%>
<%= location %>host=<%= values["host"] %>
<%= location %>port=<%= values["port"] %>
...

在调用sort 之前无需获取reg_connection 的密钥——您可以直接在哈希上调用它。实际上,这会将散列转换为键值对数组(双元素数组),Ruby 可以轻松地对其进行排序。然后,当我们调用 each 时,会将两个值传递给块 — location(它们是键,例如 "toronto")和 values 带有 "host""port" 等键的散列。

【讨论】:

    猜你喜欢
    • 2022-09-27
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    相关资源
    最近更新 更多