Puppet:如何使用一組通用套件但允許例外?

Puppet:如何使用一組通用套件但允許例外?

我有大約 200 個或多或少相同的 Linux 虛擬機器。所有常見配置都有一個類別:

class my_packages {

    class { "::ntp":
        servers     => [ "de.pool.ntp.org" ],
    }
    ....
}

我將其包含在 site.pp 的每個節點中。

現在我想運行我自己的本地時間伺服器,使用 puppetlabs/ntp 套件這很簡單。我只需將 my_packages 中的伺服器條目替換為新時間伺服器 VM 的 IP 位址,並且該 VM 現在具有與先前在 my_packages 中使用的相同的 ntp 類別條目。

node 'mytime' {

#    include my_packages

    class { '::ntp':
        servers => [
            'de.pool.ntp.org',
            'ptbtime1.ptb.de',
            'ptbtime2.ptb.de',
            'ptbtime3.ptb.de',
        ],
    }
    ...
}

但是,由於現在在節點中定義了類別“::ntp”條目,因此我無法在新時間伺服器虛擬機的節點條目中包含 my_packages,因為在這種情況下我收到“重複聲明”錯誤。

使用本機名稱伺服器時也會出現類似的問題。每個虛擬機器都有一個指向本機名稱伺服器的 /etc/resolv.conf 文件,因此 my_packages 中有一個文件資源。但本地名稱伺服器本身必須有不同的 /etc/resolv.conf 檔案 - 在安裝完成之前它無法指向自身,但安裝過程中並非如此。

使用一組通用資源但允許偶爾出現例外的最佳實踐是什麼?

答案1

如果您使用 Puppet 3 或更高版本,解決此問題的最佳方法是使用 hiera 執行自動參數查找。簡而言之,它允許您使用包含語法而不是資源樣式語法來聲明類,這意味著您可以對該類別進行多個聲明。請注意,您不能混合類別的包含和資源樣式聲明。

通常,如果您使用 include 語法來聲明一個類,如果它有任何必需的參數,它就會失敗。當您使用自動參數查找時,puppet 將嘗試透過 hiera 尋找參數值。

Hiera 之所以如此命名,是因為它將嘗試透過資料來源的層次結構來尋找值。您可以在 hiera.yaml 中指定此層次結構,它可以與各種事實(主機名稱、自訂事實等)進行配對或檢查硬編碼檔案。

這是一個可能適用於您的情況的簡短範例:

類別定義:

class my_packages {
  include ::ntp
  ...
}

mytime.yaml:

----
ntp::servers:
  - 'de.pool.ntp.org'
  - 'ptbtime1.ptb.de'
  - 'ptbtime2.ptb.de'
  - 'ptbtime3.ptb.de'

common.yaml:

---
ntp::servers: ['de.pool.ntp.org']

hiera.yaml:

...
:hierarchy:
 - "${::fqdn}"
 - common
...

在這種情況下,hiera 將嘗試使用鍵 ntp::servers 在 ntp 類別中尋找伺服器參數的值。它首先會在與主機名稱相符的任何 yaml 檔案中尋找該鍵,然後在 common.yaml 中尋找。

在大多數情況下,它會使用 common.yaml 中的鍵,但在 mytime 節點的情況下,它會在層次結構中找到更高的值並停止在那裡查找。

這是一個連結完整的例子,它順便涵蓋了 ntp 模組。

相關內容