Всем привет. Сегодня я расскажу вам, как из openLDAP собрать отказоустойчивый и легко масштабируемый кластер LDAP авторизации. Не для кого не секрет, что идеальным средством хранения учетных записей на сервере проверки авторизации, в силу ряда причин, является LDAP, минусом которого является то, что мало кто точно знает, как же эта штуковина работает и как ее настроить, я постараюсь объяснить основные элементы и описать процедуру настройки, отказоустойчивого кластера авторизации на openLDAP, но для начала немного теории.
Что такое LDAP и с чем его едят.
LDAP (Lightweight Directory Access Protocol— «облегчённый протокол доступа к каталогам») — относительно простой протокол, использующий IP/TCP и позволяющий производить аутентификации, поиск, сравнения, а также операции добавления, изменения или удаления записей. Обычно LDAP-сервер принимает входящие соединения на порт 389 по протоколам TCP или UDP для сеансов SSL, обычно используется порт 636. Технически, LDAP — это протокол определяющий методы доступа к каталогу. Он также определяет и описывает, как данные представлены в службе каталогов, а так же каким образом данные загружаются и выгружаются из службы каталогов (с использованием LDIF). LDAP не является БД и не отвечает за процесс хранения и манипулирование данными. За данные процедуры отвечают БД выступающие в роли back-end (в наше случае это BerkeleyDB — высокопроизводительная встраиваемая база данных, реализованная в виде библиотеки. BDB является нереляционной базой данных— она хранит пары ключ/значение как массивы байтов и поддерживает множество значений для одного ключа, может обслуживать тысячи процессов или потоков, одновременно.)
LDAP определяет четыре модели, я кратенько их перечислю, но по сути она не особо нужна для понимания.
Информационная модель: определяет, каким образом данные представлены в DB. Как я уже писал, вопрос самой DB лежит за пределами LDAP.
Модель именования: иерархическая структура хранения записей, определяет все, например ‘dc=kolbosa, dc=kz’.
Функциональная модель: используется при поиске, чтении, записе или модификации LDAP
Модель безопасности: ну тут все понятно, вопрос довольно сложный. Особо углубляться пока не будем, но стоит отметить, что процедура такая — Ваш пароль передается в открытом виде на сервер, там хэшируется и сравнивается с хранимым (опасненько!). Как нибудь поделюсь, как же это решить.
Вообщем принцип LDAP – “один раз записал — много раз прочитал”.
Так почему же нужно использовать LDAP? Вот список ключевых характеристик, которые как бе невелируют минусы сложности работы с LDAP.
LDAP обладают унифицированным доступом к базе, как локально так и удаленно. Так что, вполне реально заменить один сервер LDAP на дрогой, без каких то геморроев. Реляционные СУБД позволяют использовать стандартизированные запросы (SQL), в то время как способы подключения к БД остаются уникальными для каждой СУБД.
Поскольку в LDAP используются стандартизированные методы доступа к данным, клиенты и серверы могут быть разнообразными. С великого множества источников, мне кажется, что любая уважающая себя система, должна иметь коннектор LDAP и в большинстве случаев имеет. LDAP может быть использован для представления данных, содержащихся в ориентированных на транзакции БД, в нашем случае выполнения пользовательских запросов, позволяя прозрачно (для запросов LDAP) обращаться к разным поставщикам транзакционных БД.
LDAP предоставляет метод, посредством которого данные могут быть перемещены в несколько мест, не изменяя при этом модели внешнего доступа к ним. Используя метод отсылок LDAP, данные могут быть перемещены на альтернативные LDAP-сервера путём изменения конфигурации самого сервера. Собственно об этом и пойдет речь.
Это если кратко :). По ходу пьесы, я буду рассказывать более подробно мелкие особенности и нюансы. Ну, с богом. В своем случае я использовал RHEL 6 с зашифрованными разделами, но я надеюсь, у вас не на столько суровые требования к безопасности. И так, у нас будет Centos 6 x86_64 minimal, ОЗУ 1024 Mb, HDD 20 Gb, этого более чем достаточно, для базы пользователей в 400-500. Так что нам за глаза
Ставим все необходимое
1 2 3 | yum update && yum upgrade -y yum install -y gcc make mc nano wget |
Я буду ставить все из исходников, ввиду того, что поставив последнюю версию openLdap из репозиториев я немного офигел — они переделали процедуру конфигурирования. Покапавшись минут 10-20, я нифига не понял… И решил делать по старинке, как говориться — старый конь…
1 2 3 4 | #Вариант первый, No-ssl. Об варианте с SSL, расскажу потом, но там ничего сложного нет... cd /usr/local/src/ wget -c http://download.oracle.com/berkeley-db/db-4.8.30.tar.gz && wget -c ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/openldap-2.4.23.tgz |
1 2 3 4 5 | # Собираем Berkeley DB tar -xzvf db-4.8.30.tar.gz cd ./db-4.8.30/build_unix ../dist/configure --prefix=/usr/local/BerkeleyDB4.8.30 make clean && make && make install |
Небольшая справка
Berkeley DB — высокопроизводительная встраиваемая БД, выполненная в виде библиотеки. BDB является нереляционной базой данных. BDB может обслуживать тысячи процессов или потоков, одновременно. Может обслуживать БД размером в 256 терабайт.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | CPPFLAGS="-I/usr/local/BerkeleyDB4.8.30/include" LDFLAGS="-L/usr/local/lib -L/usr/local/BerkeleyDB4.8.30/lib -R/usr/local/BerkeleyDB4.8.30/lib" LD_LIBRARY_PATH="/usr/local/BerkeleyDB4.8.30/lib" export LD_LIBRARY_PATH export LDFLAGS export CPPFLAGS # Создаем пути, для сборки LDAP cd /usr/local/src/ cd ./openldap-2.4.23 ./configure --prefix=/usr/local/openldap make depend && make && make install # Собираем LDAP # Наш LDAP собран. Конфигурации по адресу /usr/local/openldap/etc/openldap/slapd.conf /usr/local/openldap/etc/openldap/ldap.conf |
Давайте рассмотрим схему которую будем строить.
У нас имеется два мастера (MASTER1 и MASTER2) и реплики (количество не ограниченно, но в нашем случае три для каждого мастера). Различие между мастером и репликой очевидно: мастер — запись и чтение, реплика — только чтение, т.е. сервис проверки авторизации должен подключаться к реплике (в нашем случае к балансировщику), а сервис создания аккаунтов к мастеру. В случае падения любого элемента схемы, другие замещают его и после восстановления работоспособности — синхронизируются. По сути, данная схема может быть модернизирована под ваши, конкретные требования, так как, по сути, состоит из блоков. Так же, данный способ репликации является основополагающим для типа репликации N-Way Multi-Master — при такой конфигурации любое количество главных серверов может синхронизироваться друг с другом, но об этом способе я напишу как-нибудь потом. И так — начнем с MASTER.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | nano /etc/nsswitch.conf passwd: files ldap shadow: files ldap group: files ldap # nsswitch.conf - конфигурационный файл для выбора соответствующей службы имен. nano /etc/pam.d/system-auth-ac #%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 500 quiet auth sufficient pam_ldap.so use_first_pass auth required pam_deny.so account required pam_unix.so account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 500 quiet account default=bad success=ok user_unknown=ignore pam_ldap.so account required pam_permit.so password requisite pam_cracklib.so try_first_pass retry=3 type= password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok password sufficient pam_ldap.so use_authtok password required pam_deny.so session required pam_mkhomedir.so skel=/etc/skel/ umask=0022 session optional pam_keyinit.so revoke session required pam_limits.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so session optional pam_ldap.so |
system-auth-ac — конфигурационный для PAM. Каждая составляющая операционной системы, требующая аутентификации (telnet server, ftp server, web server и т.д. и т. п.) имеет специальный встроенный код. В нынешнее время мы используем подключаемые модули аутентификации (“Pluggable Authentication Modules”). В LDAP – окружении, РАМ — модуль используется LDAP сервером для аутентификации пользователей. РАМ поддерживается как NIX, так и Windows.
Ну а теперь самое главное — настраиваем LDAP
/usr/local/openldap/etc/openldap/slapd.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 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 67 | # # See slapd.conf(5) for details on configuration options. # This file should NOT be world readable. # # Подключаем наши схемы, подробнее вы можете узнать тут <a href="http://pro-ldap.ru/sources/index.html#schema">http://pro-ldap.ru/sources/index.html#schema</a> include /usr/local/openldap/etc/openldap/schema/core.schema include /usr/local/openldap/etc/openldap/schema/corba.schema include /usr/local/openldap/etc/openldap/schema/cosine.schema include /usr/local/openldap/etc/openldap/schema/nis.schema include /usr/local/openldap/etc/openldap/schema/inetorgperson.schema pidfile /usr/local/openldap/var/run/slapd.pid argsfile /usr/local/openldap/var/run/slapd.args # Load dynamic backend modules: modulepath /usr/local/openldap ####################################################################### # BDB Иницеализируем базу. ####################################################################### database bdb suffix "dc=my,dc=ldap" rootdn "cn=admin,dc=my,dc=ldap" # Создаем нашу базу и пользователя. rootpw MyPASS # Указываем пароль для cn=admin,dc=my,dc=ldap, по этому пользователю и пароль #будет происходить синхронизация, между репликами directory /usr/local/openldap/var/openldap-data # Определяем основные индексы. index objectClass,entryCSN,entryUUID eq,pres index ou,cn,mail,surname,givenname eq,pres,sub index uidNumber,gidNumber,loginShell eq,pres index uid,memberUid eq,pres,sub index nisMapName,nisMapEntry eq,pres,sub overlay syncprov syncprov-checkpoint 100 10 syncprov-sessionlog 100 # И вот наша репликация. #serverID 1 <a href="ldap://192.168.1.1">ldap://192.168.1.1</a> # наш MASTER1 — с ним мы встретимся при настроке MASTER2 serverID 2 <a href="ldap://192.168.1.2">ldap://192.168.1.2</a> # наш MASTER2 #syncrepl rid=001 # наш serverID # provider=<a href="ldap://192.168.1.1">ldap://192.168.1.1</a> # провайдер — uri. # bindmethod=simple # определяет тип аутентификации, принимает значение от simple|kerberos| sasl (simple — логин/пароль, kerberos — по билету kerberos, sasl — по сертификату ssl) # binddn="cn=admin,dc=my,dc=ldap" # определяет админа. # credentials=MyPASS # задаем пароль # searchbase="dc=my,dc=ldap" # задаем зону поиска # schemachecking=on # проверка схемы. # type=refreshAndPersist # тип синхронизации принимает значения от refreshAndPersist|refreshOnly (refreshAndPersist — обновлять #и сохранять, refreshOnly — только обновлять) # retry="60 +" # проверять каждые 60 сек. syncrepl rid=002 provider=ldap://192.168.1.2 bindmethod=simple binddn="cn=admin,dc=my,dc=ldap" credentials= MyPASS searchbase="dc=my,dc=ldap" schemachecking=on type=refreshAndPersist retry="60 +" mirrormode on # включаем режим зеркала. |
Теперь редактируем ldap.conf, для мастера.
/usr/local/openldap/etc/openldap/ldap.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # # LDAP Defaults # # See ldap.conf(5) for details # This file should be world readable but not world writable. #BASE dc=example,dc=com #URI ldap://ldap.example.com ldap://ldap-master.example.com:666 #SIZELIMIT 12 #TIMELIMIT 15 #DEREF never host 127.0.0.1 base dc=my,dc=ldap timelimit 120 bind_timelimit 120 idle_timelimit 3600 nss_initgroups_ignoreusers root,ldap,named,avahi,haldaemon,dbus,radvd,tomcat,radiusd,news,mailman,nscd,gdm,username,rudi uri ldap://192.168.1.1/ ssl no tls_cacertdir /usr/local/openldap/etc/openldap/cacerts pam_password md5 |
Теперь настраиваем второй мастер…
Собственно все точно так же.
/usr/local/openldap/etc/openldap/slapd.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | # # See slapd.conf(5) for details on configuration options. # This file should NOT be world readable. # # Подключаем наши схемы, подробнее вы можете узнать тут <a href="http://pro-ldap.ru/sources/index.html#schema">http://pro-ldap.ru/sources/index.html#schema</a> include /usr/local/openldap/etc/openldap/schema/core.schema include /usr/local/openldap/etc/openldap/schema/corba.schema include /usr/local/openldap/etc/openldap/schema/cosine.schema include /usr/local/openldap/etc/openldap/schema/nis.schema include /usr/local/openldap/etc/openldap/schema/inetorgperson.schema pidfile /usr/local/openldap/var/run/slapd.pid argsfile /usr/local/openldap/var/run/slapd.args # Load dynamic backend modules: modulepath /usr/local/openldap ####################################################################### # BDB Иницеализируем базу. ####################################################################### database bdb suffix "dc=my,dc=ldap" rootdn "cn=admin,dc=my,dc=ldap" # Создаем нашу базу и пользователя. rootpw MyPASS # Указываем пароль для cn=admin,dc=my,dc=ldap, по этому пользователю и пароль #будет происходить синхронизация, между репликами directory /usr/local/openldap/var/openldap-data # Определяем основные индексы. index objectClass,entryCSN,entryUUID eq,pres index ou,cn,mail,surname,givenname eq,pres,sub index uidNumber,gidNumber,loginShell eq,pres index uid,memberUid eq,pres,sub index nisMapName,nisMapEntry eq,pres,sub overlay syncprov syncprov-checkpoint 100 10 syncprov-sessionlog 100 # И вот наша репликация. serverID 1 <a href="ldap://192.168.1.1">ldap://192.168.1.1</a> # наш MASTER1 #serverID 2 <a href="ldap://192.168.1.2">ldap://192.168.1.2</a> # наш MASTER2 syncrepl rid=002 provider=ldap://192.168.1.1 bindmethod=simple binddn="cn=admin,dc=my,dc=ldap" credentials= MyPASS searchbase="dc=my,dc=ldap" schemachecking=on type=refreshAndPersist retry="60 +" mirrormode on # включаем режим зеркала. nano /usr/local/openldap/etc/openldap/ldap.conf # # LDAP Defaults # # See ldap.conf(5) for details # This file should be world readable but not world writable. #BASE dc=example,dc=com #URI ldap://ldap.example.com ldap://ldap-master.example.com:666 #SIZELIMIT 12 #TIMELIMIT 15 #DEREF never host 127.0.0.1 base dc=my,dc=ldap timelimit 120 bind_timelimit 120 idle_timelimit 3600 nss_initgroups_ignoreusers root,ldap,named,avahi,haldaemon,dbus,radvd,tomcat,radiusd,news,mailman,nscd,gdm,username,rudi uri ldap://192.168.1.2/ ssl no tls_cacertdir /usr/local/openldap/etc/openldap/cacerts pam_password md5 |
С мастерами усе ))) Приступаем к репликам.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 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 | # # See slapd.conf(5) for details on configuration options. # This file should NOT be world readable. # # Подключаем наши схемы, подробнее вы можете узнать тут <a href="http://pro-ldap.ru/sources/index.html#schema">http://pro-ldap.ru/sources/index.html#schema</a> include /usr/local/openldap/etc/openldap/schema/core.schema include /usr/local/openldap/etc/openldap/schema/corba.schema include /usr/local/openldap/etc/openldap/schema/cosine.schema include /usr/local/openldap/etc/openldap/schema/nis.schema include /usr/local/openldap/etc/openldap/schema/inetorgperson.schema pidfile /usr/local/openldap/var/run/slapd.pid argsfile /usr/local/openldap/var/run/slapd.args # Load dynamic backend modules: modulepath /usr/local/openldap ####################################################################### # BDB Иницеализируем базу. ####################################################################### database bdb suffix "dc=my,dc=ldap" rootdn "cn=admin,dc=my,dc=ldap" # Создаем нашу базу и пользователя. rootpw MyPASS # Указываем пароль для cn=admin,dc=my,dc=ldap, по этому пользователю и пароль #будет происходить синхронизация, между репликами directory /usr/local/openldap/var/openldap-data # Определяем основные индексы. index objectClass,entryCSN,entryUUID eq,pres index ou,cn,mail,surname,givenname eq,pres,sub index uidNumber,gidNumber,loginShell eq,pres index uid,memberUid eq,pres,sub index nisMapName,nisMapEntry eq,pres,sub overlay syncprov syncprov-checkpoint 100 10 syncprov-sessionlog 100 # И вот наша репликация. serverID 1 <a href="ldap://192.168.1.1">ldap://192.168.1.1</a> # наш MASTER1 serverID 2 <a href="ldap://192.168.1.2">ldap://192.168.1.2</a> # наш MASTER2 syncrepl rid=001 provider=<a href="ldap://192.168.1.1">ldap://192.168.1.1</a> bindmethod=simple binddn="cn=admin,dc=my,dc=ldap" credentials=MyPASS searchbase="dc=my,dc=ldap" schemachecking=on type=refreshAndPersist retry="60 +" syncrepl rid=002 provider=ldap://192.168.1.2 bindmethod=simple binddn="cn=admin,dc=my,dc=ldap" credentials= MyPASS searchbase="dc=my,dc=ldap" schemachecking=on type=refreshAndPersist retry="60 +" mirrormode on # включаем режим зеркала. |
Теперь ldap.conf
/usr/local/openldap/etc/openldap/ldap.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | # # LDAP Defaults # FOR REPLICA # See ldap.conf(5) for details # This file should be world readable but not world writable. #BASE dc=example,dc=com #URI ldap://ldap.example.com ldap://ldap-master.example.com:666 #SIZELIMIT 12 #TIMELIMIT 15 #DEREF never host 192.168.1.1 192.168.1.2 base dc=my,dc=ldap port 389 timelimit 5 bind_timelimit 2 bind_policy soft idle_timelimit 3600 nss_initgroups_ignoreusers root,ldap,named,avahi,haldaemon,dbus,radvd,tomcat,radiusd,news,mailman,nscd,gdm,username,rudi uri ldap://192.168.1.1/ ldap://192.168.1.2/ ssl no tls_cacertdir /etc/openldap/cacerts pam_password md5 |
Проверяем? Проверяем.
Запускаем службы
1 2 3 | sudo /usr/local/openldap/libexec/slapd -h ldap:/// -f /usr/local/openldap/etc/openldap/slapd.conf -d -1 # -d -1 определяет уровень логирования. |
Коннектимся на MASTER1 и создаем там какую нибудь запись. Под windows у нас есть «LDAP Admin» под linux «Apache Directory Studio». Коннектимся на MASTER2 и смотрим есть ли там эта запись, смотрим на реплики… Все ок? Отключаем один из мастеров и удаляем с другого эту запись. Пускаем заново, смотрим… Запись пропала? Если да, то я вас поздравляю с настройкой отказоустойчивого кластера LDAP.
Осталось накидать какой нибудь скриптик, для удобного запуска служб ну и как то объединить их… А собственно вот:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 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 67 68 69 70 71 72 73 | #!/bin/bash export PATH=/usr/local/openldap/bin:/usr/local/openldap/sbin:/usr/local/openldap/libexec:$PATH . /etc/init.d/functions slapd=/usr/local/openldap/libexec/slapd slaps=`/usr/local/openldap/libexec/slapd -h "ldaps:///" "ldap:///" -f /usr/local/openldap/etc/openldap/slapd.conf` slurpd=/usr/sbin/slurpd slaptest=/usr/local/openldap/sbin/slaptest [ -x ${slapd} ] || exit 1 RETVAL=0 function start() { user= prog=`basename ${slapd}` # Start daemons. echo -n $"Starting $prog: " #ulimit $ULIMIT_SETTINGS > /dev/null 2>&1 daemon --check=$prog ${slaps} RETVAL=$? echo touch /var/lock/subsys/ldap return $RETVAL } function stop() { # Stop daemons. echo -n $"Stopping $prog: " killproc ${slapd} RETVAL=$? # echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/ldap /usr/local/openldap/var/run/slapd.pid return $RETVAL } # See how we were called. case "$1" in configtest) configtest ;; start) start RETVAL=$? ;; stop) stop RETVAL=$? ;; status) status ${slapd} RETVAL=$? if grep -q "^replogfile" /usr/local/openldap/etc/openldap/slapd.conf ; then status ${slurpd} RET=$? if [ $RET -ne 0 ] ; then RETVAL=$RET; fi fi ;; restart) stop start ;; condrestart) if [ -f /var/lock/subsys/ldap ] ; then stop start RETVAL=$? fi ;; *) echo $"Usage: $0 {start|stop|restart|status|condrestart}" RETVAL=1 esac |
С запуском решили. Теперь проблема с объединением, на мой взгляд самый простой и логичный способ это единый IP для мастеров и для реплик.
Создадим у каждого мастера виртуальный интерфейс.
1 | ifconfig eth0:1 <общий ip-адрес> netmask 255.255.255.0 |
Пропишем правило iptables
1 2 3 | iptables -A INPUT -d <общий ip-адрес> -i eth0 -j CLUSTERIP --new \ --hashmode sourceip-sourceport --clustermac 01:00:5E:00:01:15 \ --total-nodes 2 --local-node 1 --hash-init 1234 |
Разберём наше правило, все описывать не буду, только важное:
- -j CLUSTERIP - над этими пакетами выполняется действие CLUSTERIP.
- –new - указывает что это первое правило для данного кластерного ip-адреса.
- –hashmode - задаёт режим распределения соединений между серверами кластера. Может быть sourceip, sourceip-sourceport или sourceip-sourceport-destport.
- –clustermac - задаёт mac-адрес кластера. Это должен быть мультикастинговый mac.
- –total-nodes - задаёт количество нод в кластере.
- –local-node - задаёт номер ноды в кластере — ОН РАЗЛИЧЕН ДЛЯ КАЖДОГО НОДА.
- –hash-init - задаёт целое положительное число, необходимое для инициализации хэша. Для каждого нода ОДИНАКОВО.
Теперь скриптик, для переключения при отказе сервиса.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 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 | #!/bin/bash source /usr/clusterip function node_add { nodes_in_file=`cat /proc/net/ipt_CLUSTERIP/${CLUSTER_ADDR} | sed 's/,/ /g'` present="false" for enode in $nodes_in_file do if [ "$enode" = "$1" ]; then # Нод есть present="true" fi done if [ "$present" = "false" ]; then # Нода нет - добавить. echo "+$node_num" > /proc/net/ipt_CLUSTERIP/${CLUSTER_ADDR} fi } function node_del { nodes_in_file=`cat /proc/net/ipt_CLUSTERIP/${CLUSTER_ADDR} | sed 's/,/ /g'` for enode in $nodes_in_file do if [ "$enode" = "$1" ]; then # Нод есть - удалить echo "-$node_num" > /proc/net/ipt_CLUSTERIP/${CLUSTER_ADDR} fi done } # Проверка доступности LDAP'а на нодах node_num=0 for each_node in $NODES do node_num=`expr $node_num + 1` # По RFC LDAP выдаст версию протокола, иначе - лежит. status=`ldapsearch -h $each_node -LLL -x -b '' -s base '(objectclass=*)' "+"| grep -i "supportedLDAPVersion" | wc -l` if [ "$status" = "1" ]; then # Доступен. Если это не локальная нода надо удалить номер ноды из файла /proc/net/ipt_CLUSTERIP/${CLUSTER_ADDR} # если нода локальная - проверить что номер ноды есть в этом файле if [ "$node_num" = "$LOCAL_NODE" ]; then # Нода локальная - проверить наличие номера в файле node_add $node_num else # Нода нелокальная - удалить номер из файла если он там есть node_del $node_num fi else # Недоступен. Если это не локальная нода надо добавить номер ноды в файл /proc/net/ipt_CLUSTERIP/${CLUSTER_ADDR} # если нода локальная - проверить, чтобы номера ноды не было в файле if [ "$node_num" = "$LOCAL_NODE" ]; then # Нода локальная - удалить номер из файла если он там есть node_del $node_num else # Нода нелокальная - проверить наличие номера в файле node_add $node_num fi fi done |
Данный скрипт использует файл с параметрами по адресу
/usr/clusterip
1 2 3 4 5 6 7 8 9 10 | CLUSTER_ADDR="<общий ip-адрес>" CLUSTER_MAC="01:00:5E:00:01:15" CLUSTER_IFACE="eth0" NODES_COUNT="2" # Node numbers starts from 1 LOCAL_NODE="1" #LOCAL_NODE="2" # All nodes ip space separated list. # CAUTON!!! Nodes must go in right sequence under their numbers. NODES="<адрес первой ноды> <адрес второй ноды>" |
Процедура зеркальна для второго мастера и повторяется, для каждой группы реплик.
Собственно все, если вы разобрались в процедуре настройки, то я вас уже уважаю… Ибо LDAP такой LDAP.
Добавить комментарий