天天看點

部署主備級openldap+web管理服務

下面測試的部署機ip位址為:192.168.10.205

1)yum安裝OpenLDAP

1 [root@openldap-server ~]# yum install openldap openldap-* -y

2)配置ldap,包括準備DB_CONFIG和slapd.conf

2

[root@openldap-server ~]# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

[root@openldap-server ~]# cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf

3)生成ldap管理者密碼

[root@openldap-server ~]# slappasswd -s ldap@123

{SSHA}b6YpCvRFWAWQdJpueuyzk79VXlikj4Z1

4)修改slapd.conf,主要配置dc和rootpw,rootpw配置上面設定的密碼(rootpw必須頂格寫,與後面的密碼用Tab鍵分開!可以把檔案中rootpw前面的#去掉之後進行配置)

3

4

5

6

7

8

9

[root@openldap-server ~]# cp /etc/openldap/slapd.conf /etc/openldap/slapd.conf.bak

[root@openldap-server ~]# vim /etc/openldap/slapd.conf

......

database        bdb

suffix          "dc=kevin,dc=com"

checkpoint      1024 15

rootdn          "cn=Manager,dc=kevin,dc=com"             #管理LDAP中資訊的最高權限,即管理者權限

rootpw                {SSHA}b6YpCvRFWAWQdJpueuyzk79VXlikj4Z1

5)檢測并重新生成ldap資料庫

10

11

12

13

14

15

16

17

18

19

20

21

22

[root@openldap-server ~]# cd /etc/openldap/     

[root@openldap-server openldap]# ls slapd.d/

cn=config  cn=config.ldif

[root@openldap-server openldap]# rm -rf slapd.d/*

[root@openldap-server openldap]#

官方對于OpenLDAP2.4 ,不推薦使用 slapd.conf 作為配置檔案。從這個版本開始所有配置資料都儲存在 /etc/openldap/slapd.d/中

[root@openldap-server openldap]# rpm -qa|grep openldap

openldap-2.4.40-16.el6.x86_64

openldap-servers-sql-2.4.40-16.el6.x86_64

openldap-devel-2.4.40-16.el6.x86_64

openldap-servers-2.4.40-16.el6.x86_64

openldap-clients-2.4.40-16.el6.x86_64

[root@openldap-server openldap]# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/

5b02d207 bdb_db_open: database "dc=kevin,dc=com": db_open(/var/lib/ldap/id2entry.bdb) failed: No such file or directory (2).

5b02d207 backend_startup_one (type=bdb, suffix="dc=kevin,dc=com"): bi_db_open failed! (2)

slap_startup failed (test would succeed using the -u switch)

[root@openldap-server openldap]# slaptest -u

config file testing succeeded

6)修改相關ldap檔案權限

[root@openldap-server openldap]# chown -R ldap:ldap /var/lib/ldap/

[root@openldap-server openldap]# chown -R ldap:ldap /etc/openldap/

7)啟動slapd服務

[root@openldap-server openldap]# service slapd start

Starting slapd:                                            [  OK  ]

[root@openldap-server openldap]# service slapd status 

slapd (pid  12896) is running...

[root@openldap-server openldap]# lsof -i:389

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

slapd   12896 ldap    7u  IPv4 702934      0t0  TCP *:ldap (LISTEN)

slapd   12896 ldap    8u  IPv6 702935      0t0  TCP *:ldap (LISTEN)

8)yum安裝migrationtools

[root@openldap-server openldap]# yum install migrationtools -y

9)編輯/usr/share/migrationtools/migrate_common.ph并修改相關配置

[root@openldap-server openldap]# cp /usr/share/migrationtools/migrate_common.ph /usr/share/migrationtools/migrate_common.ph.bak

[root@openldap-server openldap]# vim /usr/share/migrationtools/migrate_common.ph

# Default DNS domain

$DEFAULT_MAIL_DOMAIN = "kevin.com";

# Default base

$DEFAULT_BASE = "dc=kevin,dc=com";

[root@openldap-server openldap]# diff /usr/share/migrationtools/migrate_common.ph /usr/share/migrationtools/migrate_common.ph.bak

71c71

< $DEFAULT_MAIL_DOMAIN = "kevin.com";

---

> $DEFAULT_MAIL_DOMAIN = "padl.com";

74c74

< $DEFAULT_BASE = "dc=kevin,dc=com";

> $DEFAULT_BASE = "dc=padl,dc=com";

10)生成base.ldif

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

[root@openldap-server openldap]# /usr/share/migrationtools/migrate_base.pl >base.ldif

[root@openldap-server openldap]# cat base.ldif

dn: dc=kevin,dc=com

dc: kevin

objectClass: top

objectClass: domain

dn: ou=Hosts,dc=kevin,dc=com

ou: Hosts

objectClass: organizationalUnit

dn: ou=Rpc,dc=kevin,dc=com

ou: Rpc

dn: ou=Services,dc=kevin,dc=com

ou: Services

dn: nisMapName=netgroup.byuser,dc=kevin,dc=com

nismapname: netgroup.byuser

objectClass: nisMap

dn: ou=Mounts,dc=kevin,dc=com

ou: Mounts

dn: ou=Networks,dc=kevin,dc=com

ou: Networks

dn: ou=People,dc=kevin,dc=com

ou: People

dn: ou=Group,dc=kevin,dc=com

ou: Group

dn: ou=Netgroup,dc=kevin,dc=com

ou: Netgroup

dn: ou=Protocols,dc=kevin,dc=com

ou: Protocols

dn: ou=Aliases,dc=kevin,dc=com

ou: Aliases

dn: nisMapName=netgroup.byhost,dc=kevin,dc=com

nismapname: netgroup.byhost

11)添加base.ldif到ldap(輸入密碼為上面建立的:ldap@123)

[root@openldap-server openldap]# ldapadd -x -D "cn=Manager,dc=kevin,dc=com" -W -f ./base.ldif

Enter LDAP Password:

adding new entry "dc=kevin,dc=com"

adding new entry "ou=Hosts,dc=kevin,dc=com"

adding new entry "ou=Rpc,dc=kevin,dc=com"

adding new entry "ou=Services,dc=kevin,dc=com"

adding new entry "nisMapName=netgroup.byuser,dc=kevin,dc=com"

adding new entry "ou=Mounts,dc=kevin,dc=com"

adding new entry "ou=Networks,dc=kevin,dc=com"

adding new entry "ou=People,dc=kevin,dc=com"

adding new entry "ou=Group,dc=kevin,dc=com"

adding new entry "ou=Netgroup,dc=kevin,dc=com"

adding new entry "ou=Protocols,dc=kevin,dc=com"

adding new entry "ou=Aliases,dc=kevin,dc=com"

adding new entry "nisMapName=netgroup.byhost,dc=kevin,dc=com"

12)檢查ldapadd是否成功(輸入密碼為上面建立的:ldap@123)(必須檢查确認Manager資料添加了,才能通過phpldapAdmin登入)

[root@openldap-server openldap]# ldapsearch -x -D "cn=Manager,dc=kevin,dc=com" -b "ou=Aliases,dc=kevin,dc=com" -W 

# extended LDIF

#

# LDAPv3

# base <ou=Aliases,dc=kevin,dc=com> with scope subtree

# filter: (objectclass=*)

# requesting: ALL

# Aliases, kevin.com

# search result

search: 2

result: 0 Success

# numResponses: 2

# numEntries: 1

13)yum安裝httpd及PhpLdapAdmin

[root@openldap-server openldap]# rpm -ivh http://mirrors.ukfast.co.uk/sites/dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

[root@openldap-server openldap]# yum install httpd phpldapadmin -y

14)配置/etc/httpd/conf.d/phpldapadmin.conf允許從遠端通路

[root@openldap-server openldap]# vim /etc/httpd/conf.d/phpldapadmin.conf      #可以先把此檔案cp備份一份

Alias /phpldapadmin /usr/share/phpldapadmin/htdocs 

Alias /ldapadmin /usr/share/phpldapadmin/htdocs 

<Directory /usr/share/phpldapadmin/htdocs> 

  Order Deny,Allow 

  Allow from all 

  Allow from 127.0.0.1                         #或者去掉下面這三行内容,表示運作所有客戶機通路(本測試案例就去掉了這三行)

  Allow from ::1

  Allow from 192.168.10.206 192.168.10.207     #允許哪些IP位址通路phpldapadmin

</Directory>

15)修改/etc/phpldapadmin/config.php配置用DN登入

[root@openldap-server openldap]# cp /etc/phpldapadmin/config.php /etc/phpldapadmin/config.php.bak

[root@openldap-server openldap]# vim /etc/phpldapadmin/config.php

.......

//$servers->setValue('login','attr','uid');      #注釋掉這一行

$servers->setValue('login','attr','dn');         #添加這一行

[root@openldap-server openldap]# diff /etc/phpldapadmin/config.php /etc/phpldapadmin/config.php.bak

398,399c398,399

< //$servers->setValue('login','attr','uid');

< $servers->setValue('login','attr','dn');

> $servers->setValue('login','attr','uid');

>

16)啟動httpd服務

[root@openldap-server openldap]# service httpd start

Starting httpd: httpd: apr_sockaddr_info_get() failed for openldap-server

httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

                                                           [  OK  ]

[root@openldap-server openldap]# service httpd status

httpd (pid  13010) is running...

[root@openldap-server openldap]# lsof -i:80

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

httpd   13010   root    4u  IPv6 757231      0t0  TCP *:http (LISTEN)

httpd   13012 apache    4u  IPv6 757231      0t0  TCP *:http (LISTEN)

httpd   13013 apache    4u  IPv6 757231      0t0  TCP *:http (LISTEN)

httpd   13014 apache    4u  IPv6 757231      0t0  TCP *:http (LISTEN)

httpd   13015 apache    4u  IPv6 757231      0t0  TCP *:http (LISTEN)

httpd   13016 apache    4u  IPv6 757231      0t0  TCP *:http (LISTEN)

httpd   13017 apache    4u  IPv6 757231      0t0  TCP *:http (LISTEN)

httpd   13018 apache    4u  IPv6 757231      0t0  TCP *:http (LISTEN)

httpd   13019 apache    4u  IPv6 757231      0t0  TCP *:http (LISTEN)

17)打開Web UI并登入LDAP(登入使用者名為"cn=Manager,dc=kevin,dc=com",密碼為"ldap@123")

18)導入新資料

[root@openldap-server openldap]# pwd

/etc/openldap

[root@openldap-server openldap]# vim test.ldif      

dn: ou=technology,dc=kevin,dc=com

changetype: add

objectclass: top

objectclass: organizationalUnit

ou: technology

dn: cn=wang shibo,ou=technology,dc=kevin,dc=com

objectclass: person

objectclass: organizationalPerson

objectclass: inetOrgPerson

cn: wang shibo

sn: wang

description: boy, man

description: man

uid: goodman

[root@openldap-server openldap]# ldapadd -x -D "cn=Manager,dc=kevin,dc=com" -w ldap@123 -f test.ldif

adding new entry "ou=technology,dc=kevin,dc=com"

adding new entry "cn=wang shibo,ou=technology,dc=kevin,dc=com"

============================================================

如果報錯:

ldapadd: attributeDescription "dn": (possible missing newline after line 9, entry "ou=technology,dc=kevin,dc=com"?)

ldap_add: Type or value exists (20)

        additional info: ou: value #0 provided more than once

産生原因:test.ldif檔案中的不規範的空格所緻!!即導入的資料含有空格所緻!

糾錯如下:

dn:(空格)ou=technology,dc=kevin,dc=com

changetype:(空格)add(結尾無空格)

objectclass:(空格)top(結尾無空格)

objectclass:(空格)organizationalUnit(結尾無空格)

ou:(空格)echnology(結尾無空格)

(1空行,空行必須要定格,不能留白格)(結尾無空格)

........(後面的配置内容糾正方法同樣)

===========================================================

檢視上面所導入的資料:

[root@openldap-server openldap]# ldapsearch -x -D "cn=Manager,dc=kevin,dc=com" -b "ou=technology,dc=kevin,dc=com" -w ldap@123

# base <ou=technology,dc=kevin,dc=com> with scope subtree

# technology, kevin.com

# wang shibo, technology, kevin.com

objectClass: person

objectClass: organizationalPerson

objectClass: inetOrgPerson

# numResponses: 3

# numEntries: 2

可以登陸phpLDAPadmin的web界面查詢新導入的資料

再次導入其他資料 

[root@openldap-server openldap]# vim test.ldif

dn: cn=chenlu,ou=technology,dc=kevin,dc=com

cn: chenlu

sn: chenlu

description: girl

uid: UI Designer

adding new entry "cn=chenlu,ou=technology,dc=kevin,dc=com"

# chenlu, technology, kevin.com

# numResponses: 4

# numEntries: 3

===============OpenLDAP日志功能開啟=================

1)需要在slapd.conf配置檔案裡加上日志行 ,這裡的日志級别有很多種,這裡選擇256這個值的級别(主從節點都要打開openldap日志功能)

[root@openldap-master ~]# cp /etc/openldap/slapd.conf /etc/openldap/slapd.conf.bak3

[root@openldap-master ~]# vim /etc/openldap/slapd.conf           #中間的空格用tab鍵分開

loglevel  256

2)修改了配置檔案,所有得重新生成配置檔案的資訊

[root@openldap-master ~]# rm -rf /etc/openldap/slapd.d/*

[root@openldap-master ~]# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/

[root@openldap-master ~]# slaptest -u

[root@openldap-master ~]# chown -R ldap:ldap /var/lib/ldap/

[root@openldap-master ~]# chown -R ldap:ldap /etc/openldap/

3)修改/etc/rsyslog.conf檔案,加上下面内容

[root@openldap-master ~]# cp /etc/rsyslog.conf /etc/rsyslog.conf.bak

[root@openldap-master ~]# vim /etc/rsyslog.conf

........

local4.*                                                /var/log/slapd/slapd.log

4)建立日志檔案目錄,授權

[root@openldap-master ~]# mkdir /var/log/slapd

[root@openldap-master ~]# chmod 755 /var/log/slapd/

[root@openldap-master ~]# chown ldap.ldap /var/log/slapd/

5)重新開機syslog服務和slapd服務

[root@openldap-master ~]# /etc/init.d/rsyslog restart

Shutting down system logger:                               [  OK  ]

Starting system logger:                                    [  OK  ]

[root@openldap-master ~]# /etc/init.d/slapd restart

Stopping slapd:                                            [  OK  ]

[root@openldap-master ~]# lsof -i:389

slapd   13773 ldap    7u  IPv4 840484      0t0  TCP *:ldap (LISTEN)

slapd   13773 ldap    8u  IPv6 840485      0t0  TCP *:ldap (LISTEN)

6)檢視openldap日志資訊

[root@openldap-master ~]# tail -f /var/log/slapd/slapd.log

===============OpenLDAP主從模式配置=================

OpenLDAP主從同步的原理:當在主伺服器上更新資料時,該更新通過更新日志記錄,并将更新複制到從伺服器上

OpenLdap v2.3之前的同步複制缺點

-  slurpd守護程序是以推模式操作 : 主伺服器推送變更的資料到從伺服器 (不可靠)

-  對replog中的記錄的次序極為敏感

-  很容易失去同步, 這時需要手工幹預來從主目錄重新同步從伺服器資料庫

-  如果一個從伺服器長時間停機,replog可能變得太大以至于slurpd無法處理

-  隻工作在推模式(也可以設定為拉模式,但是這種感覺類似于将master上的資料做了一個快捷連接配接到slave上)

-  需要停止和重新啟動主伺服器來增加從伺服器

-  隻支援單一主伺服器複制(1台主對多從)

OpenLDAP v2.4之後的同步功能

新版最大的功能就是實作了雙向複制,即雙主、多主模式,無論哪一台master當機,都不會影響使用。

新版主從配置有五種方式:

1)Syncrepl

該方式是slave伺服器以拉的方式同步master的使用者資料,這是基本也是最簡單的openldap主從配置的方式。

該方式缺點:當修改一個條目中的一個屬性值(or大批量的萬級别的某1屬性值),它不是簡單的同步過來這些屬性,而是把修改的條目一起同步更新來。

2)Delta-syncrepl

比上一條多了個功能:基于日志同步:

在master每更改1條記錄,肯定會産生1條日志,那麼slave會通過你的master日志進行相應的修改,這就克服了上一條的缺點。

3)N-Way Multi-Master

多主方式同步LDAP資訊

4)MirrorMode

該方式是伺服器互相推送資訊的方式同步使用者資料;MirrorMode隻支援2個主master(2個主master可以+N個slave),但是你如果非得加了3 、4 台master後,

那麼其餘的都隻能從前2台master上擷取資料,而不能将本身的資料推送過去。如果你有類似需求,也可以使用這個方式。(比如,你企業分散點多,然後不希望

都具有修改功能,可以使用它)

5)Syncrepl Proxy

代理同步。意思是将主master隐藏起來,而代理機上邊通過Syncrepl從master主機以拉的方式同步master使用者資料,當代理主機發生改變時,代理主機的LDAP

又以推的方式将資料更新到下屬的slave LDAP伺服器上。slave LDAP 隻有對代理LDAP伺服器的讀權限。

Syncrepl同步解釋

由于syncrepl為拉取模式(到master拉資料),是以配置檔案配置slave端的slapd.conf檔案即可。初始化操作2種:

1)通過配置檔案,當開啟syncrepl引擎後會到master拉資料;

2)從主伺服器備份資料,複制到slave。當從備份資料初始化的時候,不必擔心資料老,因為syncrepl會自動進行校驗,然後進行相應的修改、同步。

(當複制一個大規模的“條錄”,建議從備份初始化)

需要注意的是:slave是使用讀寫權限到master中進行同步的!

基于上面的部署,上面的測試機192.168.10.205作為openldap-master主節點,新增一台伺服器192.168.10.206作為openldap-slave從節點。OpenLDAP主從配置如下:

1)基礎環境

192.168.10.205    openldap-master

192.168.10.206    openldap-slave

綁定hosts(兩個節點機器上都要操作)

[root@openldap-master ~]# cat /etc/hosts

關閉兩個節點機器的防火牆和selinux(兩個節點機器上都要操作)

[root@openldap-master ~]# /etc/init.d/iptables stop

[root@openldap-master ~]# chkconfig iptables off

[root@openldap-master ~]# chkconfig --list|grep iptables

iptables        0:off 1:off 2:off 3:off 4:off 5:off 6:off

同步系統時間(兩個節點機器上都要操作)

[root@openldap-master ~]# yum install -y ntpdate

[root@openldap-master ~]# ntpdate ntp1.aliyun.com

2)Openldap-slave從節點同樣安裝和配置OpenLDAP和PhpLdapAdmin(和上面安裝即配置步驟一樣,在此省略)。為了測試效果,設定從節點的密碼為123@ldap

[root@openldap-slave ~]# slappasswd -s 123@ldap

{SSHA}X3wlj1uJmB50FM4rNN4869VCeMd92Pcr

3)Openldap-master主節點和Openldap-slave從節點的PhpLdapAdmin和http配置一樣

4)OpenLDAP的主從配置

-----------------------------------------------------------------

penldap-master主節點的配置如下:

[root@openldap-master ~]# cp /etc/openldap/slapd.conf /etc/openldap/slapd.conf.bak2

[root@openldap-master ~]# vim /etc/openldap/slapd.conf        #在檔案底部添加下面同步配置(之前的配置不動)

modulepath /usr/lib/openldap                                  #一定要打開這幾行的注釋

modulepath /usr/lib64/openldap

moduleload syncprov.la

#replication

index entryCSN,entryUUID      eq

overlay syncprov

syncprov-nopresent TRUE

syncprov-reloadhint TRUE

syncprov-checkpoint 100 10

syncprov-sessionlog 100

重新生成主節點的配置檔案

[root@openldap-master ~]# service slapd restart

slapd   13214 ldap    7u  IPv4 763380      0t0  TCP *:ldap (LISTEN)

slapd   13214 ldap    8u  IPv6 763381      0t0  TCP *:ldap (LISTEN)

----------------------------------------------------------------

penldap-slave從節點的配置如下:

[root@openldap-slave ~]# cp /etc/openldap/slapd.conf /etc/openldap/slapd.conf.bak2

[root@openldap-slave ~]# vim /etc/openldap/slapd.conf

modulepath /usr/lib/openldap                         #一定要打開這幾行的注釋

modulepath /usr/lib64/openldap       

rootdn          "cn=Manager,dc=kevin,dc=com"

rootpw          {SSHA}X3wlj1uJmB50FM4rNN4869VCeMd92Pcr

# slave replica statement start

syncrepl  rid=123

          provider=ldap://192.168.10.205:389

          type=refreshOnly  

          interval=00:00:00:01    

          searchbase="dc=kevin,dc=com"

          scope=sub

          attrs="*"  

          schemachecking=off    

          bindmethod=simple

          binddn="cn=Manager,dc=kevin,dc=com"

          credentials=ldap@123

重新生成從節點的配置檔案

[root@openldap-slave ~]# rm -rf /etc/openldap/slapd.d/*

[root@openldap-slave ~]# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/

5b02f6ae syncrepl rid=123 searchbase="dc=kevin,dc=com": no retry defined, using default

[root@openldap-slave ~]# slaptest -u

5b02f6b4 syncrepl rid=123 searchbase="dc=kevin,dc=com": no retry defined, using default

[root@openldap-slave ~]# chown -R ldap:ldap /var/lib/ldap/

[root@openldap-slave ~]# chown -R ldap:ldap /etc/openldap/

[root@openldap-slave ~]# service slapd restart

Checking configuration files for slapd:                    [WARNING]

5b02f6c6 syncrepl rid=123 searchbase="dc=kevin,dc=com": no retry defined, using default

[root@openldap-slave ~]# lsof -i:389

COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME

slapd   14329 ldap    7u  IPv4 4803594      0t0  TCP *:ldap (LISTEN)

slapd   14329 ldap    8u  IPv6 4803595      0t0  TCP *:ldap (LISTEN)

5)登陸openldap-slave從節點的phpLDAPadmin的web界面(http://192.168.10.206/phpldapadmin),發現已經将上面openldap-master主節點新導入的資料同步過來了

 6)導入新資料測試主從同步效果

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

溫馨提示:由于在syncrepl中slave是refreshOnly,相當于從節點是隻讀的,這時不允許在從節點導入或者删除使用者,否則會出現錯誤!

因為隻能在master主節點上導入資料:

前面已經編輯了base.ldif,并導入了該檔案中定義的資料了(即dc=kevin,dc=com、ou=People,dc=kevin,dc=com、ou=Group,dc=kevin,dc=com等)

[root@openldap-master openldap]# pwd

[root@openldap-master openldap]# cat group.ldif

dn: cn=user1,ou=Group,dc=kevin,dc=com

objectClass: posixGroup

cn: user1

userPassword: kevin123

gidNumber: 10011

dn: cn=user2,ou=Group,dc=kevin,dc=com

cn: user2

gidNumber: 10012

dn: cn=user3,ou=Group,dc=kevin,dc=com

cn: user3

gidNumber: 10013

[root@openldap-master openldap]# cat people.ldif

dn: uid=user1,ou=People,dc=kevin,dc=com

uid: user1

objectClass: account

objectClass: posixAccount

objectClass: shadowAccount

shadowLastChange: 17053

shadowMin: 0

shadowMax: 99999

shadowWarning: 7

loginShell: /bin/bash

uidNumber: 10011

homeDirectory: /home/user1

dn: uid=user2,ou=People,dc=kevin,dc=com

uid: user2

uidNumber: 10012

homeDirectory: /home/user2

dn: uid=user3,ou=People,dc=kevin,dc=com

uid: user3

uidNumber: 10013

homeDirectory: /home/user3

執行資料導入

[root@openldap-master openldap]# ldapadd -x -D "cn=Manager,dc=kevin,dc=com" -w ldap@123 -f group.ldif

adding new entry "cn=user1,ou=Group,dc=kevin,dc=com"

adding new entry "cn=user2,ou=Group,dc=kevin,dc=com"

adding new entry "cn=user3,ou=Group,dc=kevin,dc=com"

[root@openldap-master openldap]# ldapadd -x -D "cn=Manager,dc=kevin,dc=com" -w ldap@123 -f people.ldif

adding new entry "uid=user1,ou=People,dc=kevin,dc=com"

adding new entry "uid=user2,ou=People,dc=kevin,dc=com"

adding new entry "uid=user3,ou=People,dc=kevin,dc=com"

openldap-master主節點檢視

[root@openldap-master openldap]# ldapsearch -x -D "cn=Manager,dc=kevin,dc=com" -b "ou=Group,dc=kevin,dc=com" -w ldap@123

[root@openldap-master openldap]# ldapsearch -x -D "cn=Manager,dc=kevin,dc=com" -b "ou=People,dc=kevin,dc=com" -w ldap@123

現在在openldap-slave從節點上檢視(注意這裡的從節點設定的ldap密碼是123@ldap,和主節點的ldap密碼不一樣):

[root@openldap-slave ldap]# ldapsearch -x -D "cn=Manager,dc=kevin,dc=com" -b "ou=People,dc=kevin,dc=com" -w 123@ldap

# base <ou=People,dc=kevin,dc=com> with scope subtree

# People, kevin.com

# user1, People, kevin.com

userPassword:: a2V2aW4xMjM=

# user2, People, kevin.com

# user3, People, kevin.com

# numResponses: 5

# numEntries: 4

[root@openldap-slave ldap]# ldapsearch -x -D "cn=Manager,dc=kevin,dc=com" -b "ou=Group,dc=kevin,dc=com" -w 123@ldap

# base <ou=Group,dc=kevin,dc=com> with scope subtree

# Group, kevin.com

# user1, Group, kevin.com

# user2, Group, kevin.com

# user3, Group, kevin.com

由上面slave從節點檢視到的資料可知,slave從節點已經将master主節點新導入的輸入同步過來了!即主從同步已成功了!

登入openldap-slave從節點的phpLDAPadmin,(退出并重新登入master和slave節點的phpLDAPadmin,就能發現上面新導入的資料了)也可以看到從openldap-master主節點同步過來的資料(可以從slave的openldap日志/var/log/slapd/slapd.log檔案中檢視資料同步情況)

在openldap-master主節點上删除資料,比如删除上面在People組内建立的使用者user1和user3 

[root@openldap-master openldap]# ldapdelete -x -D "cn=Manager,dc=kevin,dc=com" "uid=user1,ou=People,dc=kevin,dc=com" -w ldap@123

[root@openldap-master openldap]# ldapdelete -x -D "cn=Manager,dc=kevin,dc=com" "uid=user3,ou=People,dc=kevin,dc=com" -w ldap@123

========================================================================

如果指令執行後報錯:ldap_bind: Invalid credentials (49)

基本就是由于密碼輸入不對或ldif檔案配置不對造成的

=========================================================================

檢視下openldap-master主節點的ldap目錄中的以上資料是否删除

[root@openldap-master openldap]# ldapsearch -x -H ldap://192.168.10.205:389 -b "dc=kevin,dc=com" |grep uid=user1

[root@openldap-master openldap]# ldapsearch -x -H ldap://192.168.10.205:389 -b "dc=kevin,dc=com" |grep uid=user3

[root@openldap-master openldap]# ldapsearch -x -H ldap://192.168.10.205:389 -b "dc=kevin,dc=com" |grep uid=user2

然後在openldap-slave從節點上檢視,發現從節點的ldap目錄中People組内也沒有使用者user1和user3了

[root@openldap-slave ldap]# ldapsearch -x -H ldap://192.168.10.206:389 -b "dc=kevin,dc=com" |grep uid=user1

[root@openldap-slave ldap]# ldapsearch -x -H ldap://192.168.10.206:389 -b "dc=kevin,dc=com" |grep uid=user3

[root@openldap-slave ldap]# ldapsearch -x -H ldap://192.168.10.206:389 -b "dc=kevin,dc=com" |grep uid=user2

說明主從節點完成了同步!

退出并重新登入openldap-master主節點或openldap-slave從節點的phpLDAPadmin,就能看到删除的資料已經不再了。

可以在主節點的phpLDAPadmin的web界面裡進行增加、删除、修改等更新操作;可以将phpLDAPadmin左邊欄用不到的條目删除(也可以不删除,以備後續使用);可以将phpLDAPadmin中已存在的條目導出Ldif檔案格式,将内容複制出來,然後在master節點上編寫新的ldif檔案(在複制的内容上根據自己的需要修改下即可)。

=========OpenLDAP+Keepalive主主模式(Mirror Mode)高可用環境配置==========

openldap主主模式配置目的

使用openldap本身的配置來完成openldap之間的同步,包括在openldap的主伺服器上添加,修改,删除使用者時,從伺服器上也和主伺服器上完成相同的操作。在從伺服器上添加,修改,删除使用者時,主伺服器上也完成一樣的操作。進而保證資料在主從openldap伺服器上的一緻。

openldap主主模式原理

其實作原理如下圖,當在主伺服器上更新資料時,該更新通過更新日志記錄,并将更新複制到從伺服器上。當在從伺服器上更新資料時,該更新請求将重定向給主伺服器,然後主伺服器将更新資料複制到從伺服器。

基于上面兩台機器192.168.10.205和192.168.10.206安裝的openldap環境,現在想要實作keepalived+openldap主主模式(Mirror Mode)模式,配置記錄如下:

1)192.168.10.205節點的slapd.conf配置

[root@openldap-master ~]# vim /etc/openldap/slapd.conf

modulepath /usr/lib/openldap                               

rootdn          "cn=Manager,dc=kevin,dc=com"           

loglevel       256      

serverID    1

syncrepl    rid=002

            provider=ldap://192.168.10.206:389

            bindmethod=simple

            binddn="cn=Manager,dc=kevin,dc=com"

            credentials=123@ldap                       #填寫的是對方機器的openldap的密碼,不是自己的openldap密碼

            searchbase="dc=kevin,dc=com"

            schemachecking=on

            filter="(objectClass=*)"

            scope=sub

            schemachecking=off

            type=refreshAndPersist

            retry="60 +"

mirrormode  on

重新生成該節點的配置檔案

slapd   14047 ldap    7u  IPv4 846134      0t0  TCP *:ldap (LISTEN)

slapd   14047 ldap    8u  IPv6 846135      0t0  TCP *:ldap (LISTEN)

2)192.168.10.206節點的slapd.conf配置

rootpw                {SSHA}X3wlj1uJmB50FM4rNN4869VCeMd92Pcr

serverID    2                                          #該ID一定不能跟另一個節點的ID相同

syncrepl    rid=002                                    #該rid一定要跟另一個節點的rid配置相同

            provider=ldap://192.168.10.205:389

            credentials=ldap@123                       #填寫的是對方機器的openldap的密碼,不是自己的openldap密碼

slapd   30022 ldap    7u  IPv4 4984193      0t0  TCP *:ldap (LISTEN)

slapd   30022 ldap    8u  IPv6 4984194      0t0  TCP *:ldap (LISTEN)

slapd   30022 ldap   11u  IPv4 4984206      0t0  TCP openldap-slave:42138->openldap-master:ldap (ESTABLISHED)

3)在192.168.10.205和192.168.10.206節點上各自導入新資料,然後測試主主同步是否生效

現在192.168.10.205節點上導入新資料

[root@openldap-master ~]# cat /etc/openldap/people.ldif

dn: uid=ops,ou=People,dc=kevin,dc=com

uid: ops

cn: ops

uidNumber: 10033

gidNumber: 10033

homeDirectory: /home/ops

[root@openldap-master ~]# ldapadd -x -D "cn=Manager,dc=kevin,dc=com" -w ldap@123 -f /etc/openldap/people.ldif

adding new entry "uid=ops,ou=People,dc=kevin,dc=com"

在192.168.10.206節點上檢視自己的ldap目錄裡是否同步過來資料了

[root@openldap-slave ~]# ldapsearch -x -D "cn=Manager,dc=kevin,dc=com" -b "ou=People,dc=kevin,dc=com" -w 123@ldap|grep uid=ops

說明從192.168.10.205節點到192.168.10.206節點的資料同步是成功的!

接着在192.168.10.206節點上導入新資料

[root@openldap-slave ~]# cat /etc/openldap/add.ldif

dn: cn=wangqiuzhe,ou=technology,dc=kevin,dc=com

cn: wangqiuzhe

description: boy

uid: anan

[root@openldap-slave ~]# ldapadd -x -D "cn=Manager,dc=kevin,dc=com" -w 123@ldap -f /etc/openldap/add.ldif

adding new entry "cn=wangqiuzhe,ou=technology,dc=kevin,dc=com"

在192.168.10.205節點上檢視自己的ldap目錄裡是否同步過來資料了

[root@openldap-master ~]# ldapsearch -x -D "cn=Manager,dc=kevin,dc=com" -b "ou=technology,dc=kevin,dc=com" -w ldap@123|grep cn=wangqiuzhe

說明從192.168.10.206節點到192.168.10.205節點的資料同步也是成功的!登入各自的phpldapadmin界面裡也可以操作資料已測試同步效果。

到此說明,兩個節點的openldap主主同步已經完成了!

4)在192.168.10.205和192.168.10.206兩個節點上均安裝keepalived,結合keepalived配置實作vip故障轉移,即對外提供一個統一的位址。

keepalived安裝(192.168.10.205和192.168.10.206兩節點都要操作)

[root@openldap-master ~]# yum -y install gcc pcre-devel zlib-devel openssl-devel

[root@openldap-master ~]# cd /usr/local/src/

[root@openldap-master src]# wget http://www.keepalived.org/software/keepalived-1.3.2.tar.gz

[root@openldap-master src]# tar -zvxf keepalived-1.3.2.tar.gz

[root@openldap-master src]# cd keepalived-1.3.2

[root@openldap-master keepalived-1.3.2]# ./configure && make && make install

[root@openldap-master keepalived-1.3.2]# cp /usr/local/src/keepalived-1.3.2/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/

[root@openldap-master keepalived-1.3.2]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

[root@openldap-master keepalived-1.3.2]# mkdir /etc/keepalived

[root@openldap-master keepalived-1.3.2]# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

[root@openldap-master keepalived-1.3.2]# cp /usr/local/sbin/keepalived /usr/sbin/

[root@openldap-master keepalived-1.3.2]# echo "/etc/init.d/keepalived start" >> /etc/rc.local

[root@openldap-master keepalived-1.3.2]# chkconfig --add keepalived

[root@openldap-master keepalived-1.3.2]# chkconfig keepalived on

[root@openldap-master keepalived-1.3.2]# chkconfig --list|grep keepalived

keepalived          0:off     1:off     2:on 3:on 4:on 5:on 6:off

===============配置keepalived.conf(VIP位址為192.168.10.228)=============

接着看下192.168.10.205節點的keepalived配置:

[root@openldap-master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

[root@openldap-master ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

   notification_email {

        root@localhost

   }

   notification_email_from root@localhost

   smtp_server localhost

   smtp_connect_timeout 30

   router_id LDAP-205

}

vrrp_script chk_ldap_port {

    script "/opt/chk_ldap.sh"

    interval 2

    weight -5

    fall 2

    rise 1

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    mcast_src_ip 192.168.10.205

    virtual_router_id 51

    priority 101

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.10.208

track_script {

   chk_ldap_port

編寫openldap監控腳本

[root@openldap-master ~]# vim /opt/chk_ldap.sh

#!/bin/bash

counter=$(ps -C slapd --no-heading|wc -l)

if [ "${counter}" = "0" ]; then

    /etc/init.d/slapd start

    sleep 2

    counter=$(ps -C slapd --no-heading|wc -l)

    if [ "${counter}" = "0" ]; then

        /etc/init.d/keepalived stop

    fi

fi

[root@openldap-master ~]# chmod 755 /opt/chk_ldap.sh

=====================================================

接着看下192.168.10.206的keepalived.conf配置

[root@openldap-slave ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

[root@openldap-slave ~]# vim /etc/keepalived/keepalived.conf

   router_id LDAP-206

    state BACKUP

    mcast_src_ip 192.168.10.206

    priority 99

[root@openldap-slave ~]# vim /opt/chk_ldap.sh

[root@openldap-slave ~]# chmod 755 /opt/chk_ldap.sh

==================================================

接着啟動192.168.10.205 和 192.168.10.206兩節點的keepalived服務

[root@openldap-master ~]# /etc/init.d/keepalived start

Starting keepalived:                                       [  OK  ]

[root@openldap-master ~]# ps -ef|grep keepalived

root     17790     1  0 16:15 ?        00:00:00 keepalived -D

root     17791 17790  0 16:15 ?        00:00:00 keepalived -D

root     17792 17790  0 16:15 ?        00:00:00 keepalived -D

root     17943 13447  0 16:16 pts/0    00:00:00 grep keepalived

[root@openldap-master ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 52:54:00:b1:9c:93 brd ff:ff:ff:ff:ff:ff

    inet 192.168.10.205/24 brd 192.168.10.255 scope global eth0

    inet 192.168.10.208/32 scope global eth0

    inet6 fe80::5054:ff:feb1:9c93/64 scope link

[root@openldap-slave ~]# /etc/init.d/keepalived start

[root@openldap-slave ~]# ps -ef|grep keepalived

root      2635     1  0 16:11 ?        00:00:00 keepalived -D

root      2636  2635  0 16:11 ?        00:00:00 keepalived -D

root      2637  2635  0 16:11 ?        00:00:00 keepalived -D

root      2650 24277  0 16:11 pts/0    00:00:00 grep keepalived

[root@openldap-slave ~]# ip addr

    link/ether 52:54:00:dd:84:6b brd ff:ff:ff:ff:ff:ff

    inet 192.168.10.206/24 brd 192.168.10.255 scope global eth0

    inet6 fe80::5054:ff:fedd:846b/64 scope link

由上面資訊可以看出,目前的VIP資源在192.168.10.205節點機器上

5)故障切換測試

關閉192.168.10.205和192.168.10.206兩個節點的slapd服務,預設每2秒鐘會進行一次腳本檢查(/opt/chk_ldap.sh),當

檢查到slapd服務關閉後,會第一時間執行/opt/chk_ldap.sh腳本去自啟動slapd服務。

[root@openldap-master ~]# /etc/init.d/slapd stop

[root@openldap-master ~]# ps -ef|grep slapd

root     18755 13447  0 16:20 pts/0    00:00:00 grep slapd

ldap     18795     1  0 16:20 ?        00:00:00 /usr/sbin/slapd -h  ldap:/// ldapi:/// -u ldap

root     18803 13447  0 16:20 pts/0    00:00:00 grep slapd

當發現slapd服務自啟動失敗時,就會自動kill掉自己的keepalived服務,進而将VIP資源自動切換到另一個節點上。

關閉192.168.10.205節點的keepalived服務,會發現VIP資源自動切換到192.168.10.206節點上

[root@openldap-master ~]# /etc/init.d/keepalived stop

Stopping keepalived:                                       [  OK  ]

root     19074 13447  0 16:22 pts/0    00:00:00 grep keepalived

當192.168.10.205節點的keepalived服務恢複後,VIP資源就會再次切換回來

root     19084     1  0 16:22 ?        00:00:00 keepalived -D

root     19085 19084  0 16:22 ?        00:00:00 keepalived -D

root     19087 19084  0 16:22 ?        00:00:00 keepalived -D

root     19099 13447  0 16:23 pts/0    00:00:00 grep keepalived

這樣,192.168.10.205和192.168.10.206兩個節點就能對外提供統一的位址:192.168.10.208。

不管是在哪個節點上更新的資料,在用戶端連接配接192.168.10.208的vip位址都能通路到。

注意:

如果192.168.10.205和192.168.10.206兩個節點的openldap登入密碼不一緻,那麼:

當VIP在192.168.10.205節點上時,使用192.168.10.208位址通路phpldapadmin,密碼就是192.168.10.205節點的openldap密碼