Стратегия бэкапа OpenLDAP

LDAP
Для того, чтобы сделать заведомо консистентный (непротиворечивый, целостный то есть) бэкап всех баз OpenLDAP, нужно:
1) Перевести соответствующую базу в режим работы read-only, если до этого она уже не работала в этом режиме;
2) Сделать полнотекстовый дамп базы с помощью утилиты slapcat, входящей в поставку серверной части OpenLDAP (более того, это просто (сим/хард)линк на slapd — бинарник самого сервера);
3) Если режим работы базы изменялся, вернуть его состояние к исходному.

Данный нехитрый алгоритм реализует приведённый ниже скрипт:
#!/bin/bash
LDAP_URI='ldap://127.0.0.1'
BIND_DN='cn=config'
BIND_PW='********'
BAK_ROOT='/bak'
SLAPCAT='/opt/OpenLDAP/current/Binaries/exe/sys/slapcat'

eval "`ldapsearch -xLLL -D "$BIND_DN" -w "$BIND_PW" -b 'cn=config' -s base olcConfigDir | \
        sed -nr 's%^olcConfigDir: (.+)$%olcConfigDir=\"\1\"%p'`"
while read attr; do
 if [[ $attr ]]; then
  eval "${attr/\: /=}"
 else
  dbID=${olcDatabase//[^0-9]/}
  bakDir="$BAK_ROOT/$olcDbDirectory"
  [[ -d "$bakDir" ]] || mkdir -p "$bakDir"

  if [[ ${olcReadOnly:=FALSE} == FALSE ]]; then
# Temporary switch database to read-only mode
   ldapmodify -x -D "$BIND_DN" -w "$BIND_PW" <<EOF
dn: olcDatabase=$olcDatabase,cn=config
changeType: modify
replace: olcReadOnly
olcReadOnly: TRUE
EOF
  fi

  pthBak="$bakDir/$(date +%y-%m-%d_%H:%M:%S).ldif"

# Get database full text (LDIF) dump
  ${SLAPCAT:-slapcat} -F "$olcConfigDir" -n $dbID > "$pthBak"

  chmod 600 "$pthBak"

  if [[ $olcReadOnly == FALSE ]]; then
# Switching database back to read-write  
  ldapmodify -x -D "$BIND_DN" -w "$BIND_PW" <<EOF
dn: olcDatabase=$olcDatabase,cn=config
changeType: modify
replace: olcReadOnly
olcReadOnly: $olcReadOnly
EOF
  fi
 fi
done < <(ldapsearch -xLLL -H $LDAP_URI -D "$BIND_DN" -w "$BIND_PW" -b 'cn=config' -s one \
 '(&(objectClass=olcDatabaseConfig)(|(objectClass=olcHdbConfig)(objectClass=olcBdbConfig)))' olcDatabase olcDbDirectory olcReadOnly)


Этот скрипт обходит все базы с бэкендов BDB (устар.) или HDB (современный) на сервере и делает их полнотекстовый дамп в каталог /bak/{оригинальный_путь_к_базе}. То есть если ваша база лежит в каталоге /var/db/openldap, то вы получите свой дамп с установленной маской доступа 600 в /bak/var/db/openldap.

ВНИМАНИЕ1: Данный скрипт предполагает, что каталог конфигурации сервера (тот, в котором хранится ветка cn=config) прописан в объекте cn=config, в атрибуте olcConfigDir. Проверьте это, и если такого атрибута там нет, добавьте его;

ВНИМАНИЕ2: Также данный скрипт предполагает, что у вас Linux, а не FreeBSD с недоразвитой версией sed, не понимающей даже элементарной опции -r. Если у вас таки FreeBSD, поменяйте в первую очередь директиву загрузчика в первой строке (путь к интерпретатору не /bin/bash) и подкорректируйте вызовы sed.

1 комментарий

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.