Puppet:在模板中迭代hiera_hash

时间:2016-07-17 20:16:13

标签: ruby hash puppet erb hiera

我在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的值以及多伦多和德州的允许值。

我的清单中有这个:

 $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 -%>

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

我的木偶输出显示它没有主机的值。我怎样才能获得这个价值?

1 个答案:

答案 0 :(得分:7)

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

<%= 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 Hash),只有一个键reg_connection。与该键关联的值本身是具有两个键torontotexas的映射。到现在为止还挺好。但是与toronto相关联的值是一个序列(读取:数组),而不是映射,因为每一行都以-开头。映射有五个项目,每个项目都有一个键和值。另一种表示相同数据结构的方法是,这可能有助于说明问题;

{ 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"],它不会起作用。

可以<{1}}替换location["host"],但这有点过分。就这样做:

reg_connection[location]["host"]

在调用<% reg_connection.sort.each do |location, values| -%> <%= location %>host=<%= values["host"] %> <%= location %>port=<%= values["port"] %> ... 之前无需获取reg_connection个键 - 您可以直接在哈希上调用它。实际上,这将把散列转换为键值对(双元素数组)的数组,Ruby在排序时没有问题。然后,当我们调用sort时,会将两个值传递给块 - each(它们键,例如location)和"toronto"哈希values,{{ 1}}等等。