2016-07-17 53 views
0

我有这样的一个YAML hiera文件。木偶:遍历一个hiera_hash模板

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 

我要访问的主机,端口,用户,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 -%> 

我想这对输出配置的两个街区在我的模板:一个是多伦多和一个为得克萨斯。

我的木偶输出表明,它并没有对主机的值。我如何获得该价值?

+0

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

回答

6

您有许多问题。第一个是,在该代码:

<%= location[host] %> 

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

您是否希望命名"host"关键,这是一个字符串来访问值,所以你必须使用该字符串。

<%= location["host"] %> 

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

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

在这里你有一个键,reg_connection的映射(这就像和被解析成-一个Ruby的Hash)。与该密钥相关的值本身就是一个映射,其中有两个密钥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(注:在惯用的红宝石,括号里的空的参数列表中省略),这意味着你没有遍历的位置,哟我正在迭代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时,将两个值传递给块-(它们的密钥,例如"toronto")和values,使用"host","port"等密钥的散列值。

+0

非常教导。非常感谢你。 – RASG