覆盖先前声明的 Puppet 资源中的参数

覆盖先前声明的 Puppet 资源中的参数

我正在尝试重建 nwaller 的sssd 木偶模块完全基于 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,
....
)

然后,这个定义被作为 传递,以concat::fragment填充用于构建最终的模板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'],
  }
}

正如预期的那样,尝试应用定义时会导致重复声明错误。有没有办法做到这一点,有选择地覆盖参数,还是我只能在原始定义中定义身份验证域,然后在每个节点中覆盖授权参数?

答案1

我会用希拉

Hiera 让您将变量数据与 Puppet 清单分离。

Hiera,顾名思义,是分层的,允许以一些有趣的方式覆盖以及组合变量数据。

首先,修改 sssd:: domain 声明以对参数执行 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”)中来排除这些默认值:

通用.yaml:

---
ldap_uri: ldaps://ldap.site.com:636
ldap_search_base: DC=site,DC=com
ldap_simple_allow_groups:
 - SysAdmins
 - AppAdmins

对于您想要基于每个主机进行个性化设置的位,您可以创建一个以该主机的 FQDN 命名的 YAML 或 JSON 文件,并在其中输入必要的值。

节点1.系统.private.yaml:

---
ldap_simple_allow_groups:
 - SomeOtherGroup

在此示例中,请注意ldap_simple_allow_groups使用的是hiera_array查找函数。这将连接层次结构中的所有有效结果。因此,node1 将获取 common.yaml 中定义的值以及其自己的 YAML 文件中定义的“SomeOtherGroup”。

阅读Hiera 查找类型文档更多细节。

答案2

虽然 Hiera 是最好的方法并且被广泛接受,但为了完整性我想补充一点:有一种语法可以实现你所想的覆盖:

node "node1.systems.private" {
  include "org::default"

  Sssd::Domain<| title == 'LDAP' |> {
    simple_allow_groups => ['SysAdmins','AppAdmins'],
  }
}

请注意,此语法还可用于收集虚拟资源,但很可能被用来覆盖资源参数。

显然,如果如此使用这种技术,将会导致混乱,因此,在大多数情况下,Hiera 更胜一筹。

相关内容