
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 クラスには適さない可能性があります。