8.3. 自动创建双条目

有些客户端以及与红帽目录服务器集成需要双条目。例如,两个 Posix 系统通常为每个用户都有一个组。目录服务器的 Managed Entries 插件会在 创建适当的原始条目时自动创建一个新的受管条目,其具有准确和特定属性值。

8.3.1. 关于受管条目

Managed Entries 插件后的基本概念是,在创建 Entry A 时,应该自动有一个带有相关属性值的 Entry B。例如,当创建 Posix 用户(posixAccount 条目)时,还应创建对应的组条目(posixGroup 条目)。Managed Entries 插件的实例标识哪个条目( 原始条目)会触发插件自动生成新条目( 受管条目)。
该插件可在目录树的定义范围内工作,因此只有该子树中的条目才会触发与给定搜索过滤器匹配的条目操作。
类似于配置服务类,受管条目通过两个条目进行配置:
  • 定义条目,用于标识插件实例和要使用的模板的范围
  • 模板条目,它建模最终受管条目是什么

8.3.1.1. 关于实例定义条目

与 Linked Attributes 和 DNA 插件一样,受管条目插件在 cn=plugins,cn=config 中有一个容器条目,插件的每个唯一配置实例在该容器下都有一个定义条目。
受管条目插件的实例定义了三项:
  • 用于标识原始条目的搜索条件(使用搜索范围和搜索过滤器)
  • 在其中创建受管条目(新条目位置)的子树
  • 用于受管条目的模板条目

图 8.2. 定义受管条目

定义受管条目
例如:
dn: cn=Posix User-Group,cn=Managed Entries,cn=plugins,cn=config
objectclass: extensibleObject
cn: Posix User-Group
originScope: ou=people,dc=example,dc=com
originFilter: objectclass=posixAccount
managedBase: ou=groups,dc=example,dc=com
managedTemplate: cn=Posix User-Group Template,ou=Templates,dc=example,dc=com
原始条目不必具有创建受管条目的任何特殊配置或设置;只需在插件范围内创建它,并与给定的搜索过滤器匹配。

8.3.1.2. 关于模板条目

插件的每个实例都使用模板条目来定义受管条目配置。模板实际上将条目从对象类提升到条目值。
注意
由于模板在定义条目中被引用,因此它可以位于目录中的任意位置。但是,建议模板条目采用复制后缀,以便多层次复制中的任何其他供应商都对受管条目插件的本地实例使用相同的模板。
模板条目的概念与 CoS 中使用的模板类似,但有一些重要的区别。受管条目模板与用于服务类的模板类型稍有不同。对于服务类,模板包含一个属性,它带有特定于该 CoS 的所有条目的特定值。对服务类的任何更改都会立即反映在关联的条目中,因为这些条目中的 CoS 属性都是虚拟属性,而不是实际在条目上设置的属性。
另一方面,Managed Entries 插件的模板条目不是为关联条目提供值的中央条目。这是一个 true 模板 - 它是条目中的内容。模板条目可以包含静态属性(一个带有预定义值,类似于 CoS)和映射的属性(从原始条目中提取其值或值部分)。模板在创建受管条目时被引用,然后在原始条目更改 时才会 应用到受管条目,并且插件再次评估该模板以应用这些更新。

图 8.3. 模板、受管条目和原始条目

模板、受管条目和原始条目
模板可以使用模板中的 static 属性为受管条目中的属性提供特定值。模板也可以使用来自原始条目中某些属性的值,因此该值可能与条目的不同;这是一个 映射 的属性,因为它引用了原始条目中的属性类型,而不是值。
映射的值使用令牌(动态值)和静态值的组合,但它只能在 映射的属性中使用一个令牌
dn: cn=Posix User-Group Template,ou=Templates,dc=example,dc=com
objectclass: mepTemplateEntry
cn: Posix User-Group Template
mepRDNAttr: cn
mepStaticAttr: objectclass: posixGroup
mepMappedAttr: cn: $cn Group Entry
mepMappedAttr: gidNumber: $gidNumber
mepMappedAttr: memberUid: $uid
模板中映射的属性使用令牌(以分号符号($)开头)从原始条目中提取值并在受管条目中使用它。(如果实际是 managed 属性值中的符号,则可以通过在一行中使用两个数字符号来转义该符号。)
映射的属性定义可以使用大括号括起来,如 Attr: ${cn}test。如果令牌名称不紧接在属性名称中有效的字符,则不需要引用令牌值,如空格或逗号。例如,$cn test 在属性定义中可以接受,因为空格字符会立即遵循属性名称,但 $cntest 无效,因为 Managed Entries 插件尝试在原始条目中查找名为 cntest 的属性。使用大括号标识属性令牌名称。
注意
确保为静态和映射的属性赋予的值符合所需的属性语法。

8.3.1.3. 由受管条目插件编写的条目属性

原始条目和受管条目都具有特殊的受管条目属性,表明它们由 Managed Entries 插件的实例管理。对于原始条目,插件会添加指向关联的受管条目的链接。
dn: uid=jsmith,ou=people,dc=example,dc=com
objectclass: mepOriginEntry
objectclass: posixAccount
...
sn: Smith
mail: jsmith@example.com
mepManagedEntry: cn=jsmith Posix Group,ou=groups,dc=example,dc=com
除了模板中定义的属性外,插件还会添加指向原始条目的属性。
dn: cn=jsmith Posix Group,ou=groups,dc=example,dc=com
objectclass: mepManagedEntry
objectclass: posixGroup
...
mepManagedBy: uid=jsmith,ou=people,dc=example,dc=com
使用特殊属性来指示受管和原始条目,可以轻松地识别相关条目并评估由 Managed Entries 插件所做的更改。

8.3.1.4. 受管条目插件和目录服务器操作

Managed Entries 插件对目录服务器执行常见操作(如添加和删除操作)有一些影响。

表 8.3. 受管条目插件和目录服务器操作

操作 受管条目插件的影响
添加 对于每个添加操作,服务器会检查新条目是否在任何受管条目插件实例范围内。如果达到原始条目的条件,则会创建一个受管条目,并将受管条目相关属性添加到原始和受管条目中。
修改
如果修改了原始条目,它会触发插件来更新受管条目。但是,更改 模板 条目不会自动更新受管条目。对模板条目的任何更改都不会反映在受管条目中,直到下次修改原始条目后。
在受管条目映射的受管属性无法手动修改,只有通过 Managed Entry 插件进行修改。受管条目中的其他属性(包括由 Managed Entry 插件添加的静态属性)可以手动修改。
删除 如果删除了原始条目,则 Managed Entries 插件也会删除与该条目关联的任何受管条目。对可以删除的条目有一些限制。
  • 如果模板条目当前由插件实例定义引用,则无法删除它。
  • 除了 Managed Entries 插件外,无法删除受管条目。
rename 如果重命名了原始条目,则插件会更新对应的受管条目。如果条目从插件范围 移出,则删除受管条目;而如果某个条目 移至 插件范围,它将被视为 add 操作,并且创建新的受管条目。与删除操作一样,可以重命名或移动条目的限制。
  • 配置定义条目不能从 Managed Entries 插件容器条目中移出。如果删除了该条目,则该插件实例将处于激活状态。
  • 如果条目 被移到 Managed Entries 插件容器条目中,则会验证它并将其视为活跃的配置定义。
  • 如果模板条目目前由插件实例定义引用,则无法重命名或移动。
  • 除了 Managed Entries 插件外,无法重命名或移动受管条目。
复制 Managed Entries 插件操作 由复制更新启动。如果插件范围中某个条目的添加或修改操作被复制到另一个副本,则该操作不会触发副本上的 Managed Entries 插件实例来创建或更新条目。要复制受管条目的更新的唯一方法是将最终受管条目复制到副本。

8.3.2. 创建受管条目模板条目

要创建的第一个条目是模板条目。模板条目必须包含生成的、受管条目所需的所有配置。这可以通过在模板的静态和映射的属性中设置 attribute-value assertions 来实现:
mepStaticAttr: attribute: specific_value
mepMappedAttr: attribute: $token_value
static 属性设置一个显式值;映射的属性从原始条目中提取一些值,以提供给定的属性。这些属性的值将是 form 属性中的令牌 : $attr。只要属性展开令牌的语法不会违反所需的属性语法,则属性中可以使用其他术语和字符串。例如:
mepMappedAttr: cn: Managed Group for $cn
受管条目必须遵循一些语法规则:
  • 映射的值使用令牌(动态值)和静态值的组合,但只能使用每个映射 的属性使用一个令牌
  • 模板中映射的属性使用令牌(以分号符号($)开头)从原始条目中提取值并在受管条目中使用它。(如果实际是 managed 属性值中的符号,则可以通过在一行中使用两个数字符号来转义该符号。)
  • 映射的属性定义可以使用大括号括起来,如 Attr: ${cn}test。如果令牌名称不紧接在属性名称中有效的字符,则不需要引用令牌值,如空格或逗号。例如,$cn test 在属性定义中可以接受,因为空格字符会立即遵循属性名称,但 $cntest 无效,因为 Managed Entries 插件尝试在原始条目中查找名为 cntest 的属性。使用大括号标识属性令牌名称。
  • 确保为静态和映射的属性赋予的值符合所需的属性语法。
注意
确保为静态和映射的属性赋予的值符合所需的属性语法。例如,如果其中一个映射的属性是 gidNumber,则映射的值应该是整数。

表 8.4. Managed Entry 模板的属性

属性 描述
mepTemplateEntry (对象类) 将条目标识为模板。
cn 提供条目的通用名称。
mepMappedAttr 包含 attribute-token 对,插件用来在受管条目中创建属性,以及从原始条目获取的值。
mepRDNAttr 指定用作受管条目中的 naming 属性的属性。用作 RDN 的属性 必须是 配置有效的映射属性。
mepStaticAttr 包含一个属性-值对,它将在受管条目中使用指定值。
创建模板条目:
使用 dsconf plugin managed-entries template add 命令添加模板条目。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin managed-entries template "cn=Posix User Template,ou=templates,dc=example,dc=com" add --rdn-attr "cn" --static-attr "objectclass: posixGroup" --mapped-attr "cn: $cn Group Entry" "gidNumber: $gidNumber" "memberUid: $uid"

8.3.3. 创建受管条目实例定义

创建模板条目后,可以创建一个指向该模板的定义条目。定义条目是 Managed Entries 插件的实例。
注意
创建定义后,服务器会检查是否存在指定的模板条目。如果模板不存在,服务器会返回一个定义配置无效的警告。
定义条目必须定义参数来标识潜在的原始条目以及创建受管条目的信息。插件实例可用的属性列在 表 8.5 “受管条目定义条目的属性” 中。

表 8.5. 受管条目定义条目的属性

属性名称 描述
originFilter 用于搜索和识别需要受管条目的子树中的条目的搜索过滤器。语法与常规搜索过滤器相同。
originScope 包含要监控的插件的潜在原始条目的基本子树。
managedTemplate 标识用于创建受管条目的模板条目。此条目可以位于目录树中的任何位置。
managedBase 要创建受管条目的子树。
注意
Managed Entries 插件默认启用。如果禁用了这个插件,请重新启用它,如 第 1.10.2 节 “启用和禁用插件” 所述。
创建实例:
  1. cn=Managed Entries,cn=plugins,cn=config 容器条目下创建新插件实例。例如:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin managed-entries config "cn=instance,cn=Managed Entries,cn=plugins,cn=config" add --scope="ou=people,dc=example,dc=com" --filter="objectclass=posixAccount" --managed-base="ou=groups,dc=example,dc=com" --managed-template="cn=Posix User-Group Template,ou=Templates,dc=example,dc=com"
    此命令设置原始条目搜索的范围和过滤器、新受管条目的位置以及要使用的模板条目。
  2. 如果目录服务器没有配置为启用动态插件,重启服务器以载入修改后的新插件实例:
    # dsctl instance_name restart

8.3.4. 将受管条目插件配置放入复制数据库中

随着 第 8.3.1 节 “关于受管条目” 突出显示,受管条目插件的不同实例创建为 cn=plugins,cn=com 中的容器插件条目下的子项。(这对允许多个实例的插件很常见。) 这样做的缺陷是 cn=plugins,cn=com 中的配置条目没有复制,因此必须在每个目录服务器实例上重新创建配置。
Managed Entries 插件条目允许 nsslapd-pluginConfigArea 属性。此属性到另一个容器条目,位于主数据库区域中,其中包含插件实例条目。此容器条目可以在复制数据库中,允许复制插件配置。
  1. 创建容器条目。例如,要创建一个指向容器条目的条目,请输入:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin managed-entries set --config-area="cn=managed entries container,ou=containers,dc=example,dc=com"