Puppet
處理 Puppet 中模組的異常
我在 Puppet 中有一個 LDAP 模組,它被 100 台伺服器使用並在所有伺服器上編輯大約 10 個文件,然後它執行 authconfig –updateall 以啟動新的 LDAP 配置。
這些伺服器中的大多數 (98) 需要一個標準的 access-1.conf 作為它們的 access.conf,但有 2 個伺服器需要 access-2.conf。這是一個大型 ldap 模組的一部分,因此所有 100 台伺服器都需要該 ldap 模組的 99%,但是一些伺服器(根據他們的角色在未來會更多)需要 access.conf 的例外。
$$ root@puppetmaster modules $$# cat /etc/puppet/hieradata/environment/prd/webserver-03.yaml 類:-webserver-webserver-apache-02
# Test variables role: webserver cluster: apache-02
我正在考慮在 manifests/init.pp 中使用類似的東西:
$role = hiera('role'); if($role = 'webserver') { file { '/etc/security/access.conf': owner => 'root', group => 'root', mode => '644', content => template('ldap/access-2.conf'), } else { file { '/etc/security/access.conf': owner => 'root', group => 'root', mode => '644', content => template('ldap/access-2.conf'), } }
DRY(不要重複自己)原則對我來說很重要,我寧願不複製整個模組。將來會有很多情況下,我希望使用角色來根據伺服器的角色分發特定的文件/配置,同時仍然與其他伺服器共享一個模組。
您如何看待使用這個角色:webserver 和 if/else 作為在模組中處理此異常的解決方案?
您可以使用自定義事實來區分它們,並使用該事實解析模板:
class foo ( $role, ){ file { '/etc/security/access.conf': owner => 'root', group => 'root', mode => '644', content => template("$role.ldap/access-2.conf"), } }
使用目前
facter
版本,很容易在您的伺服器上提供自定義事實:# cat /etc/facter/facts.d/datacenter.yaml --- role: webserver location: Oz
然後,根據您配置層次結構的方式,您可以為每個域或主機設置一個預設角色和角色,例如:
--- :backends: - yaml :hierarchy: - "%{::hostname}" - common :yaml: :datadir: "/etc/puppet/hieradata/%{::domain}/%{::location}"
在這裡,
location
也是一個自定義事實,因此也很容易建構自定義層次結構。要處理異常,請編寫自定義事實,並讓common.yaml
文件保存預設值。