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

私はZookeeperでPuppetDBを使ってノードを取得し、カスタムプラグインを使ってノードを結合しています。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、2 回目の実行でのみすべてのノードが接続されます。これは Zookeeper クラスでは問題なく機能しますが、Couchbase クラスには適さない可能性があります。

関連情報