2016-05-22 7 views
0

JSON変数からテンプレートを生成し、以下のコードを参照してください。、私はいくつかのローカルmicroservices(JSONファイルに格納された変数)のためのいくつかのZABBIXテンプレートを生成したい

def self.haproxyTemplates 
    file = File.read('./services.json') 
    data_hash = JSON.parse(file) 

    service = data_hash.keys 
    service.each do |microservice| 
    puts "Microservice: #{microservice}" 
    httpport = data_hash["#{microservice}"]['httpport'] 
    puts "httpPort: #{httpport}" 
    end 

    open("./haproxy.xml", 'w+') { |f| f.chmod(0755) 
    template=IO.read('./haproxyhealth.xml.erb') 
    x = ERB.new(template).result(binding) 
    f << "#{x}\n" 
    } 
end 

をそして、これは私のservices.jsonファイルです。

{ 
"microservice1":{ 
    ....... , 
    "httpport": "27200" 
    }, 
    "microservice2":{ 
    ......, 
    "httpport": "25201" 
    } 
} 

基本的にこの方法では、各マイクロサービスごとにループを実行しているとき、ループを終了するまで正常に実行されます。 haproxy.xmlを作成すると、 "未定義のローカル変数またはmain:Object(NameError)"のためのメソッド `httpport 'が表示されます httpport変数をループ外に置こうとしましたが、同じエラーが表示されます。

も(私は25201で<% = HTTPPORT%>を交換する場合、ファイルがcorectly生成される)ERBファイルの一部を参照してください:あなたが貼り付ける場合はここで

<items><% service.each do |microservice| %> 
      <item> 
       <name>haproxy <%= microservice %> - <%= httpport %></name> 
...... 
</item><% end %> 

答えて

1

は、実施例でありますこれを ".rb"ファイルに入れて実行することができます。

bindingにはhttportが含まれていません(それが含まれていても、再割り当てされないため、すべてのマイクロサービスで同じになります)。解決策:JSON(rubyハッシュ)データをテンプレート内に格納し、そこからループします。

require 'erb' 

# data = parse JSON from file, inline here as example 

data = { 
    'microservice1' => { 
    'httpport' => '27200' 
    }, 
    'microservice2' => { 
    'httpport' => '27201' 
    } 
} 

open("haproxy.xml", 'w+') do |file| 
    template = ERB.new(DATA.read) 
    file << template.result(binding) 
    file << "\n" 
end 


__END__ 
<items> 
    <% data.each do |name, info| %> 
    <item> 
     <name>haproxy <%= name %> - <%= info['httpport'] %></name> 
    </item> 
    <% end %> 
</items> 
+0

ありがとうございます。 ...の.erbファイル –

関連する問題