どのマシンタイプとシェフコードブロックにどのようなサービスが存在するかを示す以下のハッシュがあります。一部のサービスにはポート番号が関連付けられています。入れ子になったハッシュとエルブテンプレートにアクセスするRuby
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テンプレート内から呼び出し可能であることをI巣ハッシュな?
私はサービスを表す文字列を持つ配列を持っていて、次にポートにハッシュマッピングサービスを持っているようなことを考えていました。私はこれがうまくいくと思いますが、エルバテンプレートを埋めるためにデータを適切に抽出する方法はわかりません。
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"]}"],
編集:
私は今、ポートへのサービスに関連するハッシュを返すの下セバスチャンの答えごとにハッシュを返すラインを持っています。 ERBテンプレートで
ports: services_hash['max_logger_services'].inject{|_k,v| v},
今しかし、私はかなり私は、値のハッシュキーを照会することが出来るのですか理解していません。特に、私は変数に変数を入れ子にすることはできないようです。
<% @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に渡されていますが、値を吐き出すためにハッシュに処理されている現在のサービスにはドロップできません。これは、私がこの質問をするよう促したのと同じ基本的な問題です。特定のサービスに関するさらなるデータを見つけるために現在処理中のサービスを特定できないようです。 services_hash
はこの形式があった場合
<%= @ports["<%= service %>"] %>
私はここに間違いがあると思います。<%if service = "max-logger"%> '。 –
あなたはそうです。修正しました。 –