覆蓋先前聲明的 Puppet 資源中的參數
我正在嘗試重建 nwaller 的sssd puppet 模組,使其完全基於 LDAP 並且更簡潔。在其中,我們為表單的每個身份驗證域定義了一個資源
define sssd::domain ( $domain = $name, $domain_description = '', $domain_type, $ldap_uri = 'ldap://example.com', $ldap_search_base = 'dc=example,dc=com', $simple_allow_groups, .... )
然後,此定義作為 a 傳遞,
concat::fragment
它填寫了用於建構 final 的模板sssd.conf
。如果我在每個節點中定義 LDAP 伺服器,這一切都很好,如下所示:
節點.pp
node "node1.systems.private" { include "puppet::client" class { 'sssd': domains => [ 'LDAP' ], make_home_dir => true; } sssd::domain { 'LDAP': domain_type => 'ldap', ldap_uri => 'ldaps://ldap.site.com:636', ldap_search_base => 'DC=site,DC=com', ldap_user_search_base => 'OU=People,DC=site,DC=com', ldap_group_search_base => 'OU=Groups,DC=site,DC=com', ldap_default_bind_dn => 'CN=bindaccount,OU=Service Accounts,OU=People,DC=site,DC=com', ldap_default_authtok => 'soopersekretbindpw', simple_allow_groups => ['SysAdmins','AppAdmins'], } }
我寧願做的是一個更有層次的設置。使
sssd::domain
定義盡可能通用,這樣我就可以將其作為一個獨立於我們的組織配置的模組來維護。在全域配置中定義 LDAP 伺服器,然後在每個節點中定義需要訪問的特定組。所以更像是:模組/org/manifests/default.pp
class org::default { include "puppet::client" class { 'sssd': domains => [ 'LDAP' ], make_home_dir => true; } sssd::domain { 'LDAP': domain_type => 'ldap', ldap_uri => 'ldaps://ldap.site.com:636', ldap_search_base => 'DC=site,DC=com', ldap_user_search_base => 'OU=People,DC=site,DC=com', ldap_group_search_base => 'OU=Groups,DC=site,DC=com', ldap_default_bind_dn => 'CN=bindaccount,OU=Service Accounts,OU=People,DC=site,DC=com', ldap_default_authtok => 'soopersekretbindpw', } }
節點.pp
node "node1.systems.private" { include "org::default" sssd::domain { 'LDAP': simple_allow_groups => ['SysAdmins','AppAdmins'], } }
正如預期的那樣,這會在嘗試應用定義時導致重複聲明錯誤。有沒有辦法做到這一點,選擇性地覆蓋參數,還是我堅持在原始定義中定義身份驗證域,然後在每個節點中覆蓋授權參數?
我會使用Hiera。
Hiera 允許您將變數數據與 Puppet 清單分離。
顧名思義,Hiera 是分層的,允許一些有趣的方式來覆蓋和組合可變數據。
首先,修改您的 sssd:: 域聲明以對參數執行 Hiera 查找:
sssd::domain { 'LDAP': domain_type => 'ldap', ldap_uri => hiera('ldap_uri', 'ldaps://ldap.site.com:636'), ldap_search_base => hiera('ldap_search_base', 'DC=site,DC=com'), ldap_user_search_base => hiera('ldap_user_search_base', 'OU=People,DC=site,DC=com'), ldap_group_search_base => hiera('ldap_group_search_base', 'OU=Groups,DC=site,DC=com'), ldap_default_bind_dn => hiera('ldap_default_bind', 'CN=bindaccount,OU=ServiceAccounts,OU=People,DC=site,DC=com'), ldap_default_authtok => hiera('ldap_default_authtok', 'soopersekretbindpw'), simple_allow_groups => hiera_array('ldap_simple_allow_groups', ['SysAdmins','AppAdmins']), }
在上面的程式碼中,我為每個查找定義了預設值。如果願意,您可以通過在最通用的 Hiera 數據文件(通常是“common.yaml”或“common.json”)中保留預設值來排除這些:
common.yaml:
--- ldap_uri: ldaps://ldap.site.com:636 ldap_search_base: DC=site,DC=com ldap_simple_allow_groups: - SysAdmins - AppAdmins
對於您要基於每個主機進行個性化的位,您將創建一個以相關主機的 FQDN 命名的 YAML 或 JSON 文件,並將必要的值放入其中。
node1.systems.private.yaml:
--- ldap_simple_allow_groups: - SomeOtherGroup
在此範例中,請注意
ldap_simple_allow_groups
使用hiera_array
查找功能。這將連接層次結構中的所有有效發現。因此,node1 將獲取 common.yaml 中定義的值以及其自己的 YAML 文件中定義的“SomeOtherGroup”。閱讀Hiera 查找類型文件以了解更多詳細資訊。