Authentication

覆蓋先前聲明的 Puppet 資源中的參數

  • September 21, 2021

我正在嘗試重建 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”或“c​​ommon.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 查找類型文件以了解更多詳細資訊。

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