![Puppet:如何使用一組通用套件但允許例外?](https://rvso.com/image/658336/Puppet%EF%BC%9A%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E4%B8%80%E7%B5%84%E9%80%9A%E7%94%A8%E5%A5%97%E4%BB%B6%E4%BD%86%E5%85%81%E8%A8%B1%E4%BE%8B%E5%A4%96%EF%BC%9F.png)
我有大約 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 模組。