Ruby 访问嵌套哈希和 erb 模板
Ruby accessing nested hash and erb template
我有以下散列,列出了什么服务存在于什么机器类型和 Chef 代码块上。某些服务具有与其关联的端口号。
services_hash = {
"bugs_services" => ["bugs"],
"max_api_services" => ["max-api"],
"max_api_ports_max-api" => 84,
"max_data_services" => ["max-data-http"],
"max_data_ports_max-data-http" => 85,
"max_logger_services" => ["max-analytics", "max-logger"],
"max_logger_ports_max-analytics" => 83,
"max_logger_ports_max-logger" => 82
}
%w( max_api max_data max_logger ).each do |haproxy_chef_role|
template "/home/ubuntu/ansible/deploy/role_#{haproxy_chef_role}.yml" do
source 'haproxy_services.yml.erb'
owner 'ubuntu'
group 'ubuntu'
action :create
mode 0644
variables({
number_of_services: number_of_services,
services: services_hash["#{haproxy_chef_role}_services"],
ports: ???
haproxy_chef_role: haproxy_chef_role
})
end
end
我也有一个类似于此的 erb 模板。
<% @services.each do |service| -%>
<% if service.include?("max-logger") %>
shell: for i in {0..<%= @number_of_services %>}; do echo <%= service %>:<%= ports %>$(printf '%02d' $i); done
<% else %>
shell: echo <%= service %>:<%= ports %>00
<% end %>
<% end %>
我如何嵌套哈希以使端口号与给定服务相关联并且可以从 erb 模板中调用?
我在想这样的事情,我有一个数组,其中包含表示服务的字符串,然后是到端口的哈希映射服务。我认为这会起作用,但我不知道如何正确提取数据以填充我的 erb 模板。
services_hash = {
"max_logger_services" => [
"max-logger",
"max-analytics",
{ "max-analytics" => 83, "max-logger" => 82] }
}
我早些时候尝试做类似的事情,我将我当前正在处理的任何内容插入到另一个哈希查询中,但它运行不佳并且似乎是错误的方法。
ports: services_hash["#{haproxy_chef_role}_ports_#{services_hash["#{haproxy_chef_role}_services"]}"],
编辑:
我现在得到了returns Sebastian 的答案的散列,returns 散列与端口相关的服务。
ports: services_hash['max_logger_services'].inject{|_k,v| v},
虽然现在在 erb 模板中,我不太明白我应该如何查询散列键的值。特别是我似乎无法在 erb 中将变量嵌套在一起。
<% @services.each do |service| -%>
<% if service.include?("max-logger") %>
shell: for i in {0..<%= @number_of_services %>}; do echo disable server <%= service.gsub('max-', '') %>-backend/{{ ansible_fqdn }}:<%= @ports["<%= service %>"] %>$(printf '%02d' $i) | sudo socat stdio /run/admin.sock; done
✗ <% else %>
shell: echo disable server <%= service.gsub('max-', '') %>-backend/{{ ansible_fqdn }}:<%= @ports['<%= service -%>'] -%>00 | sud o socat stdio /run/admin.sock
<% end %>
<% end %>
这里的这一行似乎是问题所在。哈希正在传递给 erb,但我无法将当前正在处理的服务放入哈希中以吐出一个值。这是我遇到的同样的基本问题,促使我提出这个问题:我似乎无法分辨我当前正在处理的服务以查找有关该特定服务的更多数据。
<%= @ports["<%= service %>"] %>
如果services_hash
有这样的格式:
services_hash = {
"max_logger_services" => [
"max-logger",
"max-analytics", {
"max-analytics" => 83,
"max-logger" => 82
}
]
}
然后您可以访问 max-analytics
和 max-logger
只需:
hash = services_hash['max_logger_services'][2]
p hash['max-analytics']
# => 83
p hash['max-logger']
# => 82
如果您不知道数据是否总是以相同的方式格式化,至少您可以"dig"直到更深的哈希值:
hash = services_hash['max_logger_services'].inject{|_k,v| v}
# => {"max-analytics"=>83, "max-logger"=>82}
我有以下散列,列出了什么服务存在于什么机器类型和 Chef 代码块上。某些服务具有与其关联的端口号。
services_hash = {
"bugs_services" => ["bugs"],
"max_api_services" => ["max-api"],
"max_api_ports_max-api" => 84,
"max_data_services" => ["max-data-http"],
"max_data_ports_max-data-http" => 85,
"max_logger_services" => ["max-analytics", "max-logger"],
"max_logger_ports_max-analytics" => 83,
"max_logger_ports_max-logger" => 82
}
%w( max_api max_data max_logger ).each do |haproxy_chef_role|
template "/home/ubuntu/ansible/deploy/role_#{haproxy_chef_role}.yml" do
source 'haproxy_services.yml.erb'
owner 'ubuntu'
group 'ubuntu'
action :create
mode 0644
variables({
number_of_services: number_of_services,
services: services_hash["#{haproxy_chef_role}_services"],
ports: ???
haproxy_chef_role: haproxy_chef_role
})
end
end
我也有一个类似于此的 erb 模板。
<% @services.each do |service| -%>
<% if service.include?("max-logger") %>
shell: for i in {0..<%= @number_of_services %>}; do echo <%= service %>:<%= ports %>$(printf '%02d' $i); done
<% else %>
shell: echo <%= service %>:<%= ports %>00
<% end %>
<% end %>
我如何嵌套哈希以使端口号与给定服务相关联并且可以从 erb 模板中调用?
我在想这样的事情,我有一个数组,其中包含表示服务的字符串,然后是到端口的哈希映射服务。我认为这会起作用,但我不知道如何正确提取数据以填充我的 erb 模板。
services_hash = {
"max_logger_services" => [
"max-logger",
"max-analytics",
{ "max-analytics" => 83, "max-logger" => 82] }
}
我早些时候尝试做类似的事情,我将我当前正在处理的任何内容插入到另一个哈希查询中,但它运行不佳并且似乎是错误的方法。
ports: services_hash["#{haproxy_chef_role}_ports_#{services_hash["#{haproxy_chef_role}_services"]}"],
编辑:
我现在得到了returns Sebastian 的答案的散列,returns 散列与端口相关的服务。
ports: services_hash['max_logger_services'].inject{|_k,v| v},
虽然现在在 erb 模板中,我不太明白我应该如何查询散列键的值。特别是我似乎无法在 erb 中将变量嵌套在一起。
<% @services.each do |service| -%>
<% if service.include?("max-logger") %>
shell: for i in {0..<%= @number_of_services %>}; do echo disable server <%= service.gsub('max-', '') %>-backend/{{ ansible_fqdn }}:<%= @ports["<%= service %>"] %>$(printf '%02d' $i) | sudo socat stdio /run/admin.sock; done
✗ <% else %>
shell: echo disable server <%= service.gsub('max-', '') %>-backend/{{ ansible_fqdn }}:<%= @ports['<%= service -%>'] -%>00 | sud o socat stdio /run/admin.sock
<% end %>
<% end %>
这里的这一行似乎是问题所在。哈希正在传递给 erb,但我无法将当前正在处理的服务放入哈希中以吐出一个值。这是我遇到的同样的基本问题,促使我提出这个问题:我似乎无法分辨我当前正在处理的服务以查找有关该特定服务的更多数据。
<%= @ports["<%= service %>"] %>
如果services_hash
有这样的格式:
services_hash = {
"max_logger_services" => [
"max-logger",
"max-analytics", {
"max-analytics" => 83,
"max-logger" => 82
}
]
}
然后您可以访问 max-analytics
和 max-logger
只需:
hash = services_hash['max_logger_services'][2]
p hash['max-analytics']
# => 83
p hash['max-logger']
# => 82
如果您不知道数据是否总是以相同的方式格式化,至少您可以"dig"直到更深的哈希值:
hash = services_hash['max_logger_services'].inject{|_k,v| v}
# => {"max-analytics"=>83, "max-logger"=>82}