2017-05-22 7 views
0

どのマシンタイプとシェフコードブロックにどのようなサービスが存在するかを示す以下のハッシュがあります。一部のサービスにはポート番号が関連付けられています。入れ子になったハッシュとエルブテンプレートにアクセスする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 %>"] %> 
+0

私はここに間違いがあると思います。<%if service = "max-logger"%> '。 –

+0

あなたはそうです。修正しました。 –

答えて

2

:データは常になりますかどうかがわからない場合

hash = services_hash['max_logger_services'][2] 
p hash['max-analytics'] 
# => 83 
p hash['max-logger'] 
# => 82 

services_hash = { 
    "max_logger_services" => [ 
    "max-logger", 
    "max-analytics", { 
     "max-analytics" => 83, 
     "max-logger" => 82 
    } 
    ] 
} 

を次に、あなただけでmax-analyticsmax-loggerににアクセスすることができました同様にフォーマットされていれば、少なくとも深いハッシュ値まで「掘り下げる」ことができます:

hash = services_hash['max_logger_services'].inject{|_k,v| v} 
# => {"max-analytics"=>83, "max-logger"=>82} 
+0

データ構造から特定のタイプのデータのみを返す方法はありますか?整数、文字列、または他のデータ構造体だけを返すといいますか?あなたの答えは妥当だと思われますが、ポートマッピングが含まれていることを常に保証することはできません[2]。たぶんservices_hashから完全に分離したport_map_hashを作ることができるかもしれません。 –

+0

値やデータタイプでチェックして必要な出力を表示することができます。_ "ハッシュにそのフォーマットがある" _が最も簡単な方法でした。私は更新しました、それはあなたに役立つのですか? –

+0

さて、あなたの提案を実装するためにちょっと試しましたが、これにどのように取り組もうとしても、現在処理中のサービスに固有のポートデータを解析する方法は同じです。 –

関連する問題