我正在尝试重建 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”或“common.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 更胜一筹。