Итак статья для тех, кто использует человеческий swarm вместо ублюдского kubernetes для ушлёпков.
Запускаем в swarm mode openldap.
Предполагается что у вас уже есть swarm – делается это одной-двумя командами.
Если у вас одна нода – manager и она же воркер делаем просто
docker swarm init
Увидим
Swarm initialized: current node (o91r08ngi1x7v7f4qoednp4uk) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-03yleiqkrn9iwfc8qnuwctsulrp4v3sn4eqhrfz4kpahgnyc8r-5v6apaxtt85vbib3tdm5cb2nr \
192.168.0.132:2377
Ок. Идем далее.
Деплоить будем из docker-compose.yml файла – очень удобно. Все переменные будут указаны в файлике
.env
Итак приступим.
Создаем файлик .env и запихиваем в него следующее содержимое
OPENLDAP_VERSION=1.2.0 LDAP_PORT=389 LDAP_PORT_TSL=636 LDAP_LOG_LEVEL=256 LDAP_ORGANISATION=ITC_LIFE LTD LDAP_DOMAIN=itc-life.ru LDAP_BASE_DN= LDAP_ADMIN_PASSWORD=ADMIN_PASSWORD LDAP_CONFIG_PASSWORD=config LDAP_READONLY_USER=false LDAP_READONLY_USER_USERNAME=readonly LDAP_READONLY_USER_PASSWORD=readonly LDAP_RFC2307BIS_SCHEMA=false LDAP_BACKEND=mdb LDAP_TLS=true LDAP_TLS_CRT_FILENAME=ldap.crt LDAP_TLS_KEY_FILENAME=ldap.key LDAP_TLS_CA_CRT_FILENAME=ca.crt LDAP_TLS_ENFORCE=false LDAP_TLS_CIPHER_SUITE=SECURE256:-VERS-SSL3.0 LDAP_TLS_PROTOCOL_MIN=3.1 LDAP_TLS_VERIFY_CLIENT=demand LDAP_REPLICATION=false KEEP_EXISTING_CONFIG=false LDAP_REMOVE_CONFIG_AFTER_SETUP=true LDAP_SSL_HELPER_PREFIX=ldap PHP_LDAPADMIN_PORT=8080
Здесь мы указываем много параметров – имя домена,пароль админа и т.д и т.п.
Создаем файлик docker-compose.yml для деалоя в наш swarm.
docker-compose.yml
version: '3.3'
services:
openldap:
image: osixia/openldap:${OPENLDAP_VERSION}
#container_name: openldap
environment:
LDAP_LOG_LEVEL: "${LDAP_LOG_LEVEL}"
LDAP_ORGANISATION: "${LDAP_ORGANISATION}"
LDAP_DOMAIN: "${LDAP_DOMAIN}"
LDAP_BASE_DN: ""
LDAP_ADMIN_PASSWORD: "${LDAP_ADMIN_PASSWORD}"
LDAP_CONFIG_PASSWORD: "${LDAP_CONFIG_PASSWORD}"
LDAP_READONLY_USER: "${LDAP_READONLY_USER}"
#LDAP_READONLY_USER_USERNAME: "readonly"
#LDAP_READONLY_USER_PASSWORD: "readonly"
LDAP_RFC2307BIS_SCHEMA: "${LDAP_RFC2307BIS_SCHEMA}"
LDAP_BACKEND: "${LDAP_BACKEND}"
LDAP_TLS: "${LDAP_TLS}"
LDAP_TLS_CRT_FILENAME: "${LDAP_TLS_CRT_FILENAME}"
LDAP_TLS_KEY_FILENAME: "${LDAP_TLS_KEY_FILENAME}"
LDAP_TLS_CA_CRT_FILENAME: "${LDAP_TLS_CA_CRT_FILENAME}"
LDAP_TLS_ENFORCE: "${LDAP_TLS_ENFORCE}"
LDAP_TLS_CIPHER_SUITE: "${LDAP_TLS_CIPHER_SUITE}"
LDAP_TLS_PROTOCOL_MIN: "${LDAP_TLS_PROTOCOL_MIN}"
LDAP_TLS_VERIFY_CLIENT: "${LDAP_TLS_VERIFY_CLIENT}"
LDAP_REPLICATION: "${LDAP_REPLICATION}"
#LDAP_REPLICATION_CONFIG_SYNCPROV: "binddn="cn=admin,cn=config" bindmethod=simple credentials=$LDAP_CONFIG_PASSWORD searchbase="cn=config" type=refreshAndPersist retry="60 +" timeout=1 starttls=critical"
#LDAP_REPLICATION_DB_SYNCPROV: "binddn="cn=admin,$LDAP_BASE_DN" bindmethod=simple credentials=$LDAP_ADMIN_PASSWORD searchbase="$LDAP_BASE_DN" type=refreshAndPersist interval=00:00:00:10 retry="60 +" timeout=1 starttls=critical"
#LDAP_REPLICATION_HOSTS: "#PYTHON2BASH:['ldap://ldap.example.org','ldap://ldap2.example.org']"
KEEP_EXISTING_CONFIG: "${KEEP_EXISTING_CONFIG}"
LDAP_REMOVE_CONFIG_AFTER_SETUP: "${LDAP_REMOVE_CONFIG_AFTER_SETUP}"
LDAP_SSL_HELPER_PREFIX: "${LDAP_SSL_HELPER_PREFIX}"
#tty: true
#stdin_open: true
volumes:
- type: volume
source: ldap_data
target: /var/lib/ldap
volume:
nocopy: false
- type: volume
source: ldap_slap
target: /etc/ldap/slapd.d
volume:
nocopy: false
- type: volume
source: ldap_certs
target: /container/service/slapd/assets/certs/
volume:
nocopy: false
ports:
- "${LDAP_PORT}:389"
- "${LDAP_PORT_TSL}:636"
#domainname: "${LDAP_DOMAIN}"
hostname: "${LDAP_DOMAIN}"
networks:
ldap-network:
aliases:
- openldap.local
deploy:
#endpoint_mode: dnsrr
#mode: replicated
replicas: 1
resources:
# Hard limit - Docker does not allow to allocate more
limits:
cpus: '1'
memory: 1G
# Soft limit - Docker makes best effort to return to it
reservations:
#cpus: '0.25'
memory: 256M
# service restart policy
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 8
window: 3s
# service update configuration
update_config:
parallelism: 1
delay: 10s
failure_action: continue
monitor: 60s
max_failure_ratio: 0.3
# placement constraint - in this case on 'worker' nodes only
placement:
constraints: [node.role == manager]
phpldapadmin:
image: osixia/phpldapadmin:latest
#container_name: phpldapadmin
environment:
PHPLDAPADMIN_LDAP_HOSTS: "openldap"
PHPLDAPADMIN_HTTPS: "false"
ports:
- "${PHP_LDAPADMIN_PORT}:80"
depends_on:
- openldap
networks:
ldap-network:
aliases:
- phpldapadmin.local
deploy:
#endpoint_mode: dnsrr
#mode: replicated
replicas: 1
resources:
# Hard limit - Docker does not allow to allocate more
limits:
cpus: '1'
memory: 256M
# Soft limit - Docker makes best effort to return to it
reservations:
#cpus: '0.25'
memory: 256M
# service restart policy
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 8
window: 3s
# service update configuration
update_config:
parallelism: 1
delay: 10s
failure_action: continue
monitor: 60s
max_failure_ratio: 0.3
# placement constraint - in this case on 'worker' nodes only
placement:
constraints: [node.role == manager]
##NETWORKS
networks:
ldap-network:
driver: overlay
##VOLUMES
volumes:
ldap_data:
ldap_slap:
ldap_certs:
Данные будут храниться в volumes:
ldap_data: ldap_slap: ldap_certs:
Здесь мы указали переменные лимиты и всякую шляпу.
Запускаем.
export $(cat .env) && docker stack deploy --compose-file=docker-compose.yml ldap
Заходим в
127.0.0.1:8080
Логин
cn=admin,dc=itc-life,dc=ru
Пароль - указан в .env.
Всё.
Создаем для начала posix group, затем пользователя и наслаждаемся.
Чтобы проверить работу.
docker exec имяконтейнераopenldap ldapsearch -x -H ldap://localhost -b dc=itc-life,dc=ru -D "cn=admin,dc=itc-life,dc=ru" -w пароль_админа
Увиди текущих пользователей и т.д. и т.п
Чтобы удалить сервис.
docker stack rm ldap
