Puppet

處理 Puppet 中模組的異常

  • July 29, 2013

我在 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文件保存預設值。

引用自:https://serverfault.com/questions/526976