如何使用 puppets 存储的配置和连接来生成以分号分隔的 IP 地址列表?

如何使用 puppets 存储的配置和连接来生成以分号分隔的 IP 地址列表?

puppet 版本 2.7.18 存储配置(不是 puppetdb)

在我的例子中,我有 3 个 Couchbase 节点,它们应该连接到一个 Couchbase 连接字符串,如下所示:

192.168.19.12;192.168.19.40;192.168.19.66

因此在每个 Couchbase 服务器上我都会执行如下操作:

@@concat::fragment { "foo": target => '/tmp/foo', content => "$ipaddress", order => 1, }

在应该连接到 Couchbase 服务器的应用服务器上,我想要生成一个如下所示的 yaml 配置文件:

  couchbase:
    class:          MyCouchbaseStorage
    param:
      connection:   MyCouchbaseConnection
      connection_param:
        username:     myusername
        password:     mypassword
        bucket:       mybucket
        host:         192.168.19.12;192.168.19.40;192.168.19.66
        persist:      1

除了主机行之外,其他都没问题,但主机条目确实很棘手

我通过以下方式收集主机:

Concat::Fragment <<| tag == 'mycbtag' |>> { target => '/tmp/database.yml' }

所以现在我有一个问题,我没有“;”像这样调用 concat

@@concat::fragment { "foo": target => '/tmp/foo', content => ";$ipaddress", order => 1, }

将产生:

host:         ;192.168.19.12;192.168.19.40;192.168.19.66

像这样调用 concat

@@concat::fragment { "foo": target => '/tmp/foo', content => "$ipaddress;", order => 1, }

将产生:

host:         192.168.19.12;192.168.19.40;192.168.19.66;

那么如何修改收集的内容或如何获得所需的结果?

host:         192.168.19.12;192.168.19.40;192.168.19.66

答案1

我使用 PuppetDB 检索节点并使用自定义插件连接节点,从而为 Zookeeper 实现了此目的。有关使用 PuppetDB 的详细信息,请参阅我的原始问题,自定义插件如下所示:

require 'puppet/face'
module Puppet::Parser::Functions
    newfunction(:comma_join_nodes, :type => :rvalue) do |args|
        query = args[0]
        fact = args[1]
        q = Puppet::Face[:query, :current].facts(query)
        return q.each_value.collect { |facts| facts[fact] }.sort.join(',')
    end
end

这应该允许您在清单中创建一个字符串,如下所示:

$nodes = comma_join_nodes('Class[couchbase]', ipaddress)

它将使用 PuppetDB 查找分配了该类的所有节点couchbase,并返回它们的 IP 地址。

请注意,这是为了最终一致性- 所有节点需要运行一次才能向 PuppetDB 报告它们已couchbase分配了类,并且只有在第二次运行时它们才会全部连接。这对于我的 Zookeeper 类来说很有效,但我想可能不太适合 Couchbase 类。

相关内容