gpt4 book ai didi

ruby - Chef 和 ruby​​ 模板——如何遍历键值对?

转载 作者:数据小太阳 更新时间:2023-10-29 06:51:25 25 4
gpt4 key购买 nike

1)我有一个数据包如下:

 "zookeeper":{
"server1":"111.111.111.111",
"server2":"222.222.222.222"
},

2) 在我的 Recipe 中,我得到的散列如下。

data_bag("mydb")
db = data_bag_item("mydb", "rtb")
ZOOKEEPER = db['zookeeper']

3) 在我的 Recipe 中还有一个模板如下:

template "/etc/zookeeper/conf/zoo.cfg" do
path "/etc/zookeeper/conf/"
source "zoo.cfg.erb"
owner "root"
group "root"
mode "0644"
variables :zookeeper => #{ZOOKEEPER}
end

4) 我需要让我的模板看起来像这样

server.1=111.111.111.111:2888:3888
server.2=222.222.222.222:2888:3888

我的问题是这样的。如何将散列传递给模板,以便循环遍历散列并创建模板?我不是一个强大的 ruby​​ 编码器。

例如:

count = 1
for server, ipaddress in zookeeper:
server.count=ipaddress:2888:3888
count = count + 1

最佳答案

您的设置存在一些轻微的不一致。在您的数据包中,您为 IP 地址分配了一个名称(通过在 JSON 中使用哈希)。但是,您似乎根本没有在生成的模板中使用该名称。这有一些您应该注意的含义:

使用关联数组(在 Ruby 中称为散列或在 Javascript 中称为对象)时,元素的顺序通常不会保留,并且在添加其他元素时可能会发生显着变化。虽然在 Ruby 1.9 上做了一些努力以在遍历散列时保留插入顺序,但您通常不应依赖它。这导致两种可能的替代方案来改进您的数据包。选择哪一个取决于您的实际用例:

  • 使用数组代替散列。在数组中,顺序是保证保持的。如果您无论如何都不使用该名称(即原始哈希中的 key ),您可以简单地使用哈希并在这里安全。走这条路时,我们可以遍历模板中的数组并从中生成计数。
  • 如果顺序无关紧要,您应该使用散列中的键来命名生成到模板中的服务器。现在,您使用 server<Number>在你的数据包里,但是server.<Number>在你的模板中。这样,我们就可以使用 key 来命名您的服务器,并可能覆盖生成的名称。

使用数组

在你的数据包中使用数组时,即当你有这样的东西时:

"zookeeper": [
"111.111.111.111",
"222.222.222.222"
],

您可以在模板中像这样遍历数组:

<% @zookeeper.each_with_index do |ipaddress, index| %>
<%= "server.#{index}=#{ipaddress}:2888:3888" %>
<% end %>

这使用了 ERB template language创建您的文件。它使用了 each_with_index迭代数组中每个元素的方法。

使用哈希

当改用散列变体时,假设您已更改数据包中的键以匹配最终生成文件中的语法,您可以像这样遍历散列:

<% @zookeeper.each_pair do |name, ipaddress| %>
<%= "#{name}=#{ipaddress}:2888:3888" %>
<% end %>

这使用了 each_pair method哈希循环遍历每个键值对,从而为每个键值对生成一行输出。

向模板传递数据

作为最后的评论,您将数据传递到配方中的模板的语法很奇怪。首先,你不应该使用以大写字母开头的变量名称(比如你的 ZOOKEEPER 变量)。在 Ruby 中,这些标识常量(如值常量、类、模块……)。请改用小写名称。 Ruby 按照惯例使用 snake_case 作为变量名。

将值传递给模板时,您可以只传递变量:

db = data_bag_item("mydb", "rtb")
zookeeper = db['zookeeper']

template "/etc/zookeeper/conf/zoo.cfg" do
path "/etc/zookeeper/conf/"
source "zoo.cfg.erb"
owner "root"
group "root"
mode "0644"
variables :zookeeper => zookeeper
end

关于ruby - Chef 和 ruby​​ 模板——如何遍历键值对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11490781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com