2016-11-01 9 views
0

Pupertで設定されたRubyテンプレートのerbファイル内でのFacterの使用方法を理解しようとしています。人形Puppyを使用したRubyテンプレートでのFacter値の使用方法

から

サンプルRubyのテンプレート変数

zk.l.conn= 

予想される設定ファイルの出力

zk.l.conn=ip-xx-31-xx-xxx.ec2.internal:2181,ip-xxx-31-xx- xxx.ec2.internal:2181,ip-172-xxx-xxx-xx.ec2.internal:2181 

Facterファクトデータ:要するに

"zk-internal": [ 
    { 
    "host": "ip-xx-31-xx-xxx.ec2.internal", 
    "port": 2181, 
    "priority": 2, 
    "weight": 10 
    }, 
    { 
    "host": "ip-xxx-31-xx-xxx.ec2.internal", 
    "port": 2181, 
    "priority": 3, 
    "weight": 10 
    }, 
    { 
    "host": "ip-172-xxx-xxx-xx.ec2.internal", 
    "port": 2181, 
    "priority": 1, 
    "weight": 10 
    } 
], 

答えて

2

zk.1.conn=<%= @facts['zk-internal'].map { |h| "#{h['host']}:#{h['port']}" }.join(',') %> 

@facts['zk-internal']は、@zk-internalがハイフンのために有効な変数名にならないため、構造化ファクト値にアクセスすることができます。

.map { |h| "#{h['host']}:#{h['port']}" }はすべての要素を反復処理し、各要素から「host:port」を含む新しい文字列を返すので、ホスト/ポートの配列が返されます。

.join(',')は、各要素をコンマで区切って配列から文字列を返します。

この出力:

(パペット4.7でテスト)
zk.1.conn=ip-xx-31-xx-xxx.ec2.internal:2181,ip-xxx-31-xx-xxx.ec2.internal:2181,ip-172-xxx-xxx-xx.ec2.internal:2181 

+0

賢いあなたはカンマため '.join'を使用できるように反復中の配列としてそれを維持するために、' .map'を使用します。 –

+0

優秀!しかし、私は例ip-xx-31-xx-xxx.ec2.internalのように各ipにポートを追加する必要がありますか?2181? – rocky

+0

2番目の部分でそれを変更します - '.map {| h | "#{h ['host']}:#{h ['port']}"} 'はホスト:ポート文字列の配列を返すようになりました。 –

関連する問題