0

我试图弄清楚如何在使用 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
  }
],
4

1 回答 1

3

简而言之:

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(',')从数组中返回一个字符串,每个元素以逗号分隔。

这输出:

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 上测试)

于 2016-11-02T08:33:55.707 回答