如何使用 puppets 儲存的設定和 concat 產生以分號分隔的 IP 位址清單?

如何使用 puppets 儲存的設定和 concat 產生以分號分隔的 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 類別。

相關內容