Docker安装Open LDAP并启用syncrepl镜像同步

简单介绍如何快速通过docker启动openldap服务,并通过syncrepl机制实现目录数据的镜像复制。本文只涉及关键步骤,相关技术的入门请移步入门教程。所有本文的配置和脚本只针对bitnami/openldap镜像,并不一定具备通用性,请根据实际项目的openldap版本做对应的修改。在开始配置同步之前请确保各个节点的时间和外部导入的schema是同步并一致的。

 

本文使用的镜像:

https://hub.docker.com/r/bitnami/openldap

本文使用的ldap管理工具:

https://directory.apache.org/studio/

很强大的ldap管理工具,本地安装即可,很方便地操作ldap的数据和导入或导出ldif文件。

 

启动openldap服务

先拉取最新版本的openldap镜像并推送到本地集群中。然后通过docker stack deploy命令或其他UI工具(Portainer)启动openldap服务。

在创建stack之前需要先在物理机创建目录/data/docker/openldap/data用于挂载openldap的数据目录,以防止容器重启数据丢失。

version: '3.6'
services:
  openldap-01:
    image: cluster2:5000/bitnami/openldap:2.6.1
    volumes:
        - /data/docker/openldap/data:/bitnami/openldap
    ports:
      - target: 1389
        published: 1389
        protocol: tcp
        mode: host
    environment:
      - LDAP_ADMIN_USERNAME=admin
      - LDAP_ADMIN_PASSWORD=admin
      - LDAP_CONFIG_ADMIN_ENABLED=yes
      - LDAP_CONFIG_ADMIN_USERNAME=admin
      - LDAP_CONFIG_ADMIN_PASSWORD=admin
      - LDAP_ROOT=dc=demo,dc=com
      - LDAP_ALLOW_ANON_BINDING=no
      - LDAP_USER_DC=people
    deploy:
        replicas: 1
        placement:
            constraints: [node.labels.openldap == 01]
            
  openldap-02:
    image: cluster2:5000/bitnami/openldap:2.6.1
    volumes:
        - /data/docker/openldap/data:/bitnami/openldap
    ports:
      - target: 1389
        published: 1389
        protocol: tcp
        mode: host
    environment:
      - LDAP_ADMIN_USERNAME=admin
      - LDAP_ADMIN_PASSWORD=admin
      - LDAP_CONFIG_ADMIN_ENABLED=yes
      - LDAP_CONFIG_ADMIN_USERNAME=admin
      - LDAP_CONFIG_ADMIN_PASSWORD=admin
      - LDAP_ROOT=dc=demo,dc=com
      - LDAP_ALLOW_ANON_BINDING=no
      - LDAP_USER_DC=people
    deploy:
        replicas: 1
        placement:
            constraints: [node.labels.openldap == 02]

以上配置启动了两个openldap实例,openldap-01和openldap-02。

根dc:dc=demo,dc=com

管理员dn:cn=admin,dc=demo,dc=com

管理员密码:admin

配置管理员:cn=admin,cn=config

配置管理员密码:admin

服务启动成功后就可以用通过以上凭证访问ldap服务。其中管理员用于管理目录服务,配置管理用于管理config和schema等配置相关的内容。

 

启用syncrepl镜像同步

为每一个openldap服务添加同步用的用户

需要使用管理账号登录,分别在01和02节点导入以下配置。

syncrepl_user.ldif

version: 1

dn: uid=rpuser,ou=people,dc=demo,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: simpleSecurityObject
objectClass: shadowAccount
objectClass: inetOrgPerson
cn: rpuser
sn: rpuser
uid: rpuser
userPassword: {SSHA}oBWZtlM7e3CbUagQeUPqkVeFUmg2+4liXvRfVQ==

用户dn:rpuser,ou=people,dc=demo,dc=com"

密码:rpuser

 

节点openldap-01的配置

需要使用配置管理账号登录,在01节点导入以下配置。

syncrepl_01.ldif

#enable syncprov module
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /opt/bitnami/openldap/lib/openldap
olcModuleLoad: syncprov.so

#enable syncprov for every folder
dn: olcOverlay=syncprov,olcDatabase={2}mdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpSessionlog: 100

#unlimit fetch size
dn: cn=config
changetype: modify
replace: olcSizeLimit
olcSizeLimit: 10000

#set server id
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 1

#syncrepl directive
dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcSyncRepl
olcSyncRepl: rid=001
  provider=ldap://openldap-02:1389/
  bindmethod=simple
  binddn="uid=rpuser,ou=people,dc=demo,dc=com"
  credentials=rpuser
  searchbase="dc=demo,dc=com"
  scope=sub
  schemachecking=on
  type=refreshAndPersist
  retry="5 +"
  interval=00:00:30:00
-
add: olcMirrorMode
olcMirrorMode: TRUE

 

节点openldap-02的配置

需要使用配置管理账号登录,在01节点导入以下配置。

syncrepl_02.ldif

#enable syncprov module
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /opt/bitnami/openldap/lib/openldap
olcModuleLoad: syncprov.so

#enable syncprov for every folder
dn: olcOverlay=syncprov,olcDatabase={2}mdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpSessionlog: 100

#unlimit fetch size
dn: cn=config
changetype: modify
replace: olcSizeLimit
olcSizeLimit: 10000

#set server id
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 2

#syncrepl directive
dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcSyncRepl
olcSyncRepl: rid=001
  provider=ldap://openldap-01:1389/
  bindmethod=simple
  binddn="uid=rpuser,ou=people,dc=demo,dc=com"
  credentials=rpuser
  searchbase="dc=demo,dc=com"
  scope=sub
  schemachecking=on
  type=refreshAndPersist
  retry="5 +"
  interval=00:00:30:00
-
add: olcMirrorMode
olcMirrorMode: TRUE

节点1和节点2的配置区别在Server ID和同步的提供者不一样。该脚本设置了搜索的大小限制为10000,从dc=demo,dc=com搜索并同步数据,每30秒同步一次,失败会在5秒后重试。请根据实际的环境和项目要求进行修改。

 

遇到的问题

错误1:

rid=001 LDAP_RES_SEARCH_RESULT (4) Size limit exceeded
rid=001 (4) Size limit exceeded

错误描述:同步过程中发生的错误,同步了部分数据后达到了最大的大小限制而停止,一般默认是500。

解决办法:把以下指令保存成.ldif文件导入或执行。

dn: cn=config
changetype: modify
replace: olcSizeLimit
olcSizeLimit: 10000

 错误2

=> mdb_idl_insert_keys: c_put id failed: MDB_MAP_FULL: Environment mapsize limit reached (-30792)
=> mdb_tool_entry_put: index_entry_add failed: err=80
=> mdb_tool_entry_put: txn_aborted! Internal error (80)

错误描述:同步或导入的数据使数据库的大小超出了最大限制,默认值是10485760 bytes (10MB)。

解决办法:如果你的数据确实是那么大,我能找到的办法就是加大数据库的最大上限。

db_max_size.ldif

#db max size
dn: olcDatabase={2}mdb,cn=config
changeType: modify
add: olcDbMaxSize
olcDbMaxSize: 1000000000

 

参考

 

转载请注明出处: https://www.cnblogs.com/keitsi/p/16618565.html

posted @ 2022-08-24 09:34  keitsi  阅读(1279)  评论(0编辑  收藏  举报