我有一台 OpenLDAP OLC 服务器(2.4.23),我正尝试向 Syncprov 覆盖文件添加两个属性,但遇到了一些困难。
以下是 olcOverlay={0}syncprov.ldif 文件的内容:
# cat /etc/openldap/slapd.d/cn\=config/olcDatabase\={1}bdb/olcOverlay\={0}syncprov.ldif
dn: olcOverlay={0}syncprov
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: {0}syncprov
olcSpCheckpoint: 100 60
olcSpNoPresent: TRUE
olcSpReloadHint: TRUE
structuralObjectClass: olcSyncProvConfig
entryUUID: 727d29d6-cc5c-1032-89d0-2fc7acd5ca31
creatorsName: cn=config
createTimestamp: 20131018161654Z
entryCSN: 20131018161654.036436Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20131018161654Z
我正在尝试应用这个 LDIF:
# 猫SyncprovOverlayAdd2.ldif
dn: olcOverlay={0}syncprov,olcDatabase={1}bdb,cn=config
changetype: modify
add: olcSpCheckpoint
olcSpCheckpoint: 100 30
-
add: olcSpSessionlog
olcSpSessionlog: 1000
错误:
# ldapadd-v-f SyncprovOverlayAdd2.ldif-D“cn=config”-H“ldap://ldap01.lab.com”-W-x
ldap_initialize( ldap://ldap01.lab.com:389/??base )
Enter LDAP Password:
add olcSpCheckpoint:
100 30
add olcSpSessionlog:
1000
modifying entry "olcOverlay={0}syncprov,olcDatabase={1}bdb,cn=config"
ldap_modify: Inappropriate matching (18)
additional info: modify/add: olcSpCheckpoint: no equality matching rule
如果我使用 ldapmodify 调用它,我会得到同样的错误。我是否使用了错误的添加/修改指令或属性?
进一步的故障排除尝试:
我尝试修改没有“add:”指令的 LDIF,使其看起来像:
dn: olcOverlay={0}syncprov,olcDatabase={1}bdb,cn=config
changetype: add
olcSpCheckpoint: 100 30
olcSpSessionlog: 1000
但是当我这样做时我得到了一个不同的错误:
add olcSpCheckpoint:
100 30
add olcSpSessionlog:
1000
adding new entry "olcOverlay={0}syncprov,olcDatabase={1}bdb,cn=config"
ldap_add: Object class violation (65)
additional info: no objectClass attribute
我不太了解这些 OLC 实时变化,以及何时需要添加/修改/替换,何时需要明确设置“changetype”,何时需要在使用 ldapadd/ldapmodify 对现有条目指定 objectClass 等。
参考: 这个 ServerFault 问题有一个答案建议用“replace”替换“add”来解决这个问题,但这对我来说不起作用。
答案1
这是http://www.openldap.org/its/index.cgi/?findid=8616该问题将在 OpenLDAP 2.4.47 版本中修复。
答案2
要解决这个问题,需要做两件事。在覆盖配置文件 (olcOverlay={0}syncprov.ldif) 中,我已经有一个 olcSpCheckpoint 条目(但没有 olcSpSessionLog 条目),因此我需要将 olcSpCheckpoint 的“add:”更改为“replace:”,如下所示:
# 猫SyncprovOverlayAdd2.ldif
dn: olcOverlay={0}syncprov,olcDatabase={1}bdb,cn=config
changetype: modify
replace: olcSpCheckpoint
olcSpCheckpoint: 100 30
-
add: olcSpSessionlog
olcSpSessionlog: 1000
因此,我在 OP 底部用“参考:”注释指向的 ServerFault 链接实际上是正确的,但由于存在第二个问题,我最初无法验证它(并且在修复 LDIF 后我仍然收到错误消息)。
其次,即使在我修复了 LDIF 之后,当我尝试使用 ldapmodify 应用 LDIF 时,我仍然收到无法更改条目的错误消息(不幸的是,我丢失了终端中出现的确切消息),但我可以克隆 LDAP 服务器所在的 VM,这样我就可以在生产之外使用它的副本。当我在 VM 克隆中运行相同的 ldapmodify 命令时,它成功应用了 LDIF。所以我唯一的结论是,由于某种奇怪的原因,生产服务器上的 slapd 搞砸了,需要重新启动。我曾试图在我的单点故障生产 LDAP 服务器上避免这种情况(此外,它应该完全是 OLC,以防止必须重新启动 slapd 之类的事情),但我硬着头皮在 LDAP 服务器上重新启动了 slapd,之后我的更改顺利通过了。