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

Sco*_*ack 5 authentication puppet sssd

我正在尝试重建 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,
....
)
Run Code Online (Sandbox Code Playgroud)

然后将此定义作为 a 传递,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'],
  }
} 
Run Code Online (Sandbox Code Playgroud)

我宁愿做的是一个更加分层的设置。使sssd::domain定义尽可能通用,以便我可以将其作为独立于我们组织配置的模块进行维护。在全局配置中定义 LDAP 服务器,然后在每个节点内定义需要访问的特定组。所以更像是:

模块/组织/清单/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',
  }
} 
Run Code Online (Sandbox Code Playgroud)

节点.pp

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

  sssd::domain { 'LDAP':
    simple_allow_groups    => ['SysAdmins','AppAdmins'],
  }
}
Run Code Online (Sandbox Code Playgroud)

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

小智 5

我会使用 Hiera:http : //docs.puppetlabs.com/hiera/latest/

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']),
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我为每个查找定义了默认值。如果您愿意,您可以通过在最通用的 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
Run Code Online (Sandbox Code Playgroud)

对于您想要在每个主机的基础上个性化的位,您需要创建一个以相关主机的 FQDN 命名的 YAML 或 JSON 文件,并将必要的值放入其中。

node1.systems.private.yaml:

---
ldap_simple_allow_groups:
 - SomeOtherGroup
Run Code Online (Sandbox Code Playgroud)

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

阅读 Hiera 查找类型文档以获取更多详细信息:http : //docs.puppetlabs.com/hiera/latest/lookup_types.html

  • 伟大的。现在我必须学习海拉。新人! (2认同)