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

我试图重buildnwaller的sssd傀儡模块 ,完全基于LDAP,并有点干净。 其中我们有一个为表单的每个validation域定义的资源

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被传递,填充一个模板来构build最终的sssd.conf

如果我在每个节点中定义LDAP服务器,这一切都很好,如下所示:

nodes.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定义尽可能通用,这样我就可以将其作为独立于组织configuration的模块来维护。 在全局configuration中定义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', } } 

nodes.pp

 node "node1.systems.private" { include "org::default" sssd::domain { 'LDAP': simple_allow_groups => ['SysAdmins','AppAdmins'], } } 

正如所料,这将导致尝试应用定义时出现重复声明错误。 有没有办法做到这一点,有select地覆盖参数,或者我坚持定义原始定义的authentication域,然后覆盖每个节点内的授权参数?

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

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”)中添加默认值来排除这些缺省值:

common.yaml:

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

对于想要以每台主机为基础进行个性化的位,您需要创build一个YAML或JSON文件,该文件以相关主机的FQDN命名,并在其中放置必要的值。

node1.systems.private.yaml:

 --- ldap_simple_allow_groups: - SomeOtherGroup 

在这个例子中,请注意hiera_array使用hiera_array查找function。 这将连接层次结构中的所有有效的创build。 因此,node1将获得在common.yaml中定义的值以及在其自己的YAML文件中定义的“SomeOtherGroup”。

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

尽pipeHiera是最好的方法,并且已被广泛接受,但为了完整性,我想补充一点:有一种语法可以做到这一点:

 node "node1.systems.private" { include "org::default" Sssd::Domain<| title == 'LDAP' |> { simple_allow_groups => ['SysAdmins','AppAdmins'], } } 

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

显然,如果使用这种技术,这种技术将会导致混乱,因此再次 – 在大多数情况下,Hiera是优越的。