如何在Puppet中使用Ruby模板中的Facter值

时间:2016-11-01 18:15:42

标签: puppet erb facter

我试图找出如何在使用Puppet配置的Ruby模板erb文件中使用Facter事实。

示例Ruby模板变量

zk.l.conn=

Puppet的预期配置文件输出

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

事实数据:

"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
  }
],

1 个答案:

答案 0 :(得分: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']}" }遍历每个元素并返回包含&#34; host:port&#34;的新字符串。从每个元素,所以你有一个主机/端口数组返回。

.join(',')从数组中返回一个字符串,每个元素都以逗号分隔。

输出:

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

(在Puppet 4.7上测试)