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

How to use Facter values in Ruby template with Puppet

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

简而言之:

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

@facts['zk-internal'] 允许您访问结构化事实值,使用它是因为 @zk-internal 由于连字符而不是有效的变量名称。

.map { |h| "#{h['host']}:#{h['port']}" } 遍历每个元素和 returns 个包含每个元素的 "host:port" 的新字符串,因此您返回了一个 hosts/ports 的数组。

.join(',') returns 来自数组的字符串,每个元素以逗号分隔。

这输出:

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