我在一个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
我想访问主机、端口、用户、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 -%>
我想在我的模板中输出两个配置块:一个用于多伦多,一个用于德克萨斯。
我的木偶输出显示它对宿主没有价值。我如何访问该值?
您有很多问题。第一个是在这个代码中:
<%= 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,并被解析为Ruby Hash),只有一个密钥reg_connection
。与该键相关联的值本身就是具有两个键toronto
和texas
的映射。到目前为止还不错。但与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"]
,这将不起作用。
您可以用reg_connection[location]["host"]
替换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"
等关键字的散列。