我正在尝试重建 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 查找:
在上面的代码中,我为每个查找定义了默认值。如果愿意,您可以通过在最通用的 Hiera 数据文件(通常是“common.yaml”或“common.json”)中保留默认值来排除这些:
common.yaml:
对于您要基于每个主机进行个性化的位,您将创建一个以相关主机的 FQDN 命名的 YAML 或 JSON 文件,并将必要的值放入其中。
node1.systems.private.yaml:
在此示例中,请注意
ldap_simple_allow_groups
使用hiera_array
查找功能。这将连接层次结构中的所有有效发现。因此,node1 将获取 common.yaml 中定义的值以及其自己的 YAML 文件中定义的“SomeOtherGroup”。阅读Hiera 查找类型文档以了解更多详细信息。
虽然 Hiera 是最好的方法并且被适当地接受,但为了完整起见,我想补充一下:有一种语法可以完成您想到的这种覆盖:
请注意,此语法也用于收集虚拟资源,但很可能用于覆盖资源参数。
显然,如果因此使用这种技术会导致混乱,所以再一次 - 在大多数情况下,Hiera 是优越的。