Установка Schema Registry#
Роль для развертывания и настройки crxsr (Corax Schema Registry).
Подготовка конфигурации для использования#
Перед установкой выполните действия, приведенные в разделе Подготовка окружения.
Протокол безопасности PLAINTEXT__ZK_PLAIN_NO_AUTH__KAFKA_PLAINTEXT_NO_AUTH#
Создайте файл /tmp/installer/ansible/inventories/DEV/group_vars/all/vars.yaml и заполните его по шаблону.
# Переменные, доступные для всех ролей #
tmp_dir: /tmp/installer # путь к временной директории на конечных серверах
wait_for_start: 120 # время в секундах на корректный старт приложения (падает с ошибкой при превышении)
security: PLAINTEXT__ZK_PLAIN_NO_AUTH__KAFKA_PLAINTEXT_NO_AUTH # протокол безопасности
kafka_user: kafka # имя пользователя от имени которого запускается Kafka
kafka_group: kafka # имя группы от имени которой запускается kafka
enabled_service: true # создание сервиса и настройка сервиса ../helper/create_service.yml
crxsr:
distr: distrib.zip # Имя zip архива с дистрибутивом, размещенного в ./ansible/files/
installdir: /opt/Apache/kafka # абсолютный путь на конечном сервере к приложению
cleanLog: true # очистить путь к логам при установке
prop_var:
"server_port": 8081 # порт на котором работает CRXSR
Протокол безопасности SSL__ZK_mTLS_WITH_AUTH__KAFKA_SSL_WITH_AUTH#
Для настройки протокола безопасности требуется:
Подготовка X509 сертификата
Подготовка X509 сертификата
Могут применяться два вида X509 сертификатов:
самоподписанные (допускается для тестовых установок);
подписанные корпоративным CA (рекомендуется для промышленных установок).
Для подготовки X509 сертификата необходимо создать два JKS хранилища:
server.kafka.jks– хранилище (keystore), содержащее сертификат и приватный ключ;truststore.kafka.jks– хранилище, содержащее только сертификат корневого CA без приватного ключа изserver.kafka.jks.
Создание хранилищ с самоподписанным сертификатом
Для создания хранилищ с использованием самоподписанного сертификата выполните шаги:
Создайте каталог командой:
mkdir -p /tmp/installer/ansible/inventories/DEV/ssl/и перейдите в него командой:
cd /tmp/installer/ansible/inventories/DEV/sslСоздайте JKS хранилище с сертификатом и приватным ключом командой:
keytool -genkey -keyalg RSA -keysize 2048 -storetype JKS -alias kafka -keystore server.kafka.jks -validity 3650 -keypass <keyPassword> -storepass <keyStorePassword> -dname "CN=kafka, OU=kafka, O=kafka"Извлеките сертификат без приватного ключа из JKS во временный файл
kafka.exportкомандой:keytool -exportcert -keystore server.kafka.jks -alias kafka -file kafka.export -storepass <keyStorePassword>Импортируйте сертификат в
truststore.kafka.jksкомандой:keytool -import -keystore truststore.kafka.jks -alias kafka -file kafka.export -storepass <trustStorePassword> -noprompt -storetype JKSУдалите временный файл
kafka.export, созданный на шаге 3.
Создание хранилищ с сертификатом, подписанным корпоративным CA
Правила и алгоритм выпуска X509 сертификатов в различных организациях может отличаться. Далее описаны основные этапы подготовки конфигурации с использованием X509 сертификата, подписанного корпоративным CA:
Создайте каталог командой:
mkdir -p /tmp/installer/ansible/inventories/DEV/ssl/и перейдите в него командой:
cd /tmp/installer/ansible/inventories/DEV/sslСоздайте JKS хранилище с сертификатом и приватным ключом командой:
keytool -genkey -keyalg RSA -keysize 2048 -storetype JKS -alias kafka -keystore server.kafka.jks -validity 3650 -keypass <keyPassword> -storepass <keyStorePassword> -dname "CN=kafka, OU=kafka, O=kafka"Сгенерируйте запрос на сертификат (CSR) командой:
keytool -certreq -keystore server.kafka.jks -alias kafka -file server.kafka.csr -storepass <keyStorePassword> -ext ExtendedKeyUsage=serverAuth,clientAuthПолученный файл
server.kafka.csrподпишите в корпоративном CA. После подписания сертификата потребуются четыре файла:server.kafka.cer— cертификат в форматеcer, полученный в корпоративом CA;server.kafka.jks— хранилище, созданное на шаге 2;ca1.cer— сертификат корневого CA, полученный в корпоративом CA;ca2.pem(опционально) — cертификат промежуточного CA (может отсутствовать), полученный в корпоративом CA.
Добавьте сертификат
server.kafka.cer, полученный в корпоративом удостоверяющем центре, в созданное на шаге 2 хранилищеserver.kafka.jksкомандой:keytool -import -keystore server.kafka.jks -alias kafka -file server.kafka.cer -storepass <keyStorePassword> -noprompt -storetype JKSПодготовьте
truststore.kafka.jksс X509 сертификатом корневого CA командой:keytool -import -keystore truststore.kafka.jks -alias root -file ca1.cer -storepass <trustStorePassword> -noprompt -storetype JKS keytool -import -keystore truststore.kafka.jks -alias root -file ca2.cer -storepass <trustStorePassword> -noprompt -storetype JKSОпционально. Удалите все файлы из каталога
/tmp/installer/ansible/inventories/DEV/ssl/, кромеtruststore.kafka.jksиserver.kafka.jks, командой:
ls | grep -v "*.jks" | xargs rm -f
Подготовка ansible vars#
Создайте файл /tmp/installer/ansible/inventories/DEV/group_vars/all/vars.yaml и заполните его по шаблону:
# Переменные, доступные для всех ролей #
tmp_dir: /tmp/installer # путь к временной директории на конечных серверах
wait_for_start: 120 # время в секундах на корректный старт приложения (падает с ошибкой при превышении)
security: SSL__ZK_mTLS_WITH_AUTH__KAFKA_SSL_WITH_AUTH # протокол безопасности
kafka_user: kafka # имя пользователя от имени которого запускается Kafka
kafka_group: kafka # имя группы от имени которой запускается kafka
enabled_service: true # создание сервиса и настройка сервиса ../helper/create_service.yml
crxsr:
distr: distrib.zip # имя zip архива с дистрибутивом, размещенного в ./ansible/files/
installdir: /opt/Apache/kafka # абсолютный путь на конечном сервере к приложению
cleanLog: true # очистить путь к логам при установке
prop_var:
"server_port": 8081 # порт на котором работает CRXSR
sr_user: # пользователи в schema-registry
admin:
psw: "SeCuRePaSsWorD2"
role: 'ROLE_ADMIN'
user:
psw: "SeCuRePaSsWorD2"
role: 'ROLE_USER'
kafka:
trustStorePath: "ssl/truststore.kafka.jks" # путь от inventories/_стенд_/ до файла с trustStore (или абсолютный на сервере при needUploadJks: false)
trustStorePassword: "<truststore-password>" # пароль от trustStore
keyStorePath: "ssl/server.kafka.jks" # путь от inventories/_стенд_/ до файла с keyStore (или абсолютный на сервере при needUploadJks: false)
keyStorePassword: "<keystore-password>" # пароль от keyStore
keyPassword: "<key-password>" # пароль от ключа в хранилище
Протокол безопасности SSL__ZK_mTLS_WITH_AUTH__KAFKA_SSL_WITH_AUTH__AUDIT#
Для настройки протокола безопасности требуется:
Подготовка X509 сертификата
Подготовка X509 сертификата
Могут применяться два вида X509 сертификатов:
самоподписанные (допускается для тестовых установок);
подписанные корпоративным CA (рекомендуется для промышленных установок).
Для подготовки X509 сертификата необходимо создать два JKS хранилища:
server.kafka.jks– хранилище (keystore), содержащее сертификат и приватный ключ;truststore.kafka.jks– хранилище, содержащее только сертификат корневого CA без приватного ключа изserver.kafka.jks.
Создание хранилищ с самоподписанным сертификатом
Для создания хранилищ с использованием самоподписанного сертификата выполните шаги:
Создайте каталог командой:
mkdir -p /tmp/installer/ansible/inventories/DEV/ssl/и перейдите в него командой:
cd /tmp/installer/ansible/inventories/DEV/sslСоздайте JKS хранилище с сертификатом и приватным ключом командой:
keytool -genkey -keyalg RSA -keysize 2048 -storetype JKS -alias kafka -keystore server.kafka.jks -validity 3650 -keypass <keyPassword> -storepass <keyStorePassword> -dname "CN=kafka, OU=kafka, O=kafka"Извлеките сертификат без приватного ключа из JKS во временный файл
kafka.exportкомандой:keytool -exportcert -keystore server.kafka.jks -alias kafka -file kafka.export -storepass <keyStorePassword>Импортируйте сертификат в
truststore.kafka.jksкомандой:keytool -import -keystore truststore.kafka.jks -alias kafka -file kafka.export -storepass <trustStorePassword> -noprompt -storetype JKSУдалите временный файл
kafka.export, созданный на шаге 3.
Создание хранилищ с сертификатом, подписанным корпоративным CA
Правила и алгоритм выпуска X509 сертификатов в различных организациях может отличаться. Далее описаны основные этапы подготовки конфигурации с использованием X509 сертификата, подписанного корпоративным CA:
Создайте каталог командой:
mkdir -p /tmp/installer/ansible/inventories/DEV/ssl/и перейдите в него командой:
cd /tmp/installer/ansible/inventories/DEV/sslСоздайте JKS хранилище с сертификатом и приватным ключом командой:
keytool -genkey -keyalg RSA -keysize 2048 -storetype JKS -alias kafka -keystore server.kafka.jks -validity 3650 -keypass <keyPassword> -storepass <keyStorePassword> -dname "CN=kafka, OU=kafka, O=kafka"Сгенерируйте запрос на сертификат (CSR) командой:
keytool -certreq -keystore server.kafka.jks -alias kafka -file server.kafka.csr -storepass <keyStorePassword> -ext ExtendedKeyUsage=serverAuth,clientAuthПолученный файл
server.kafka.csrподпишите в корпоративном CA. После подписания сертификата потребуются четыре файла:server.kafka.cer— cертификат в форматеcer, полученный в корпоративом CA;server.kafka.jks— хранилище, созданное на шаге 2;ca1.cer— сертификат корневого CA, полученный в корпоративом CA;ca2.pem(опционально) — cертификат промежуточного CA (может отсутствовать), полученный в корпоративом CA.
Добавьте сертификат
server.kafka.cer, полученный в корпоративом удостоверяющем центре, в созданное на шаге 2 хранилищеserver.kafka.jksкомандой:keytool -import -keystore server.kafka.jks -alias kafka -file server.kafka.cer -storepass <keyStorePassword> -noprompt -storetype JKSПодготовьте
truststore.kafka.jksс X509 сертификатом корневого CA командой:keytool -import -keystore truststore.kafka.jks -alias root -file ca1.cer -storepass <trustStorePassword> -noprompt -storetype JKS keytool -import -keystore truststore.kafka.jks -alias root -file ca2.cer -storepass <trustStorePassword> -noprompt -storetype JKSОпционально. Удалите все файлы из каталога
/tmp/installer/ansible/inventories/DEV/ssl/, кромеtruststore.kafka.jksиserver.kafka.jks, командой:
ls | grep -v "*.jks" | xargs rm -f
Подготовка ansible vars#
Создайте файл /tmp/installer/ansible/inventories/DEV/group_vars/all/vars.yaml и заполните его по шаблону:
# Переменные, доступные для всех ролей #
tmp_dir: /tmp/installer # путь к временной директории на конечных серверах
wait_for_start: 120 # время в секундах на корректный старт приложения (падает с ошибкой при превышении)
security: SSL__ZK_mTLS_WITH_AUTH__KAFKA_SSL_WITH_AUTH # протокол безопасности
kafka_user: kafka # имя пользователя от имени которого запускается Kafka
kafka_group: kafka # имя группы от имени которой запускается kafka
enabled_service: true # создание сервиса и настройка сервиса ../helper/create_service.yml
crxsr:
distr: distrib.zip # имя zip архива с дистрибутивом, размещенного в ./ansible/files/
installdir: /opt/Apache/kafka # абсолютный путь на конечном сервере к приложению
cleanLog: true # очистить путь к логам при установке
prop_var:
"server_port": 8081 # порт на котором работает CRXSR
sr_user: # пользователи в schema-registry
admin:
psw: "SeCuRePaSsWorD2"
role: 'ROLE_ADMIN'
user:
psw: "SeCuRePaSsWorD2"
role: 'ROLE_USER'
kafka:
trustStorePath: "ssl/truststore.kafka.jks" # путь от inventories/_стенд_/ до файла с trustStore (или абсолютный на сервере при needUploadJks: false)
trustStorePassword: "<truststore-password>" # пароль от trustStore
keyStorePath: "ssl/server.kafka.jks" # путь от inventories/_стенд_/ до файла с keyStore (или абсолютный на сервере при needUploadJks: false)
keyStorePassword: "<keystore-password>" # пароль от keyStore
keyPassword: "<key-password>" # пароль от ключа в хранилище
config_audit: # настройки аудита
url: "http://localhost:8084" # префикс url для отправки событий аудита
system_id: "CORAX" # Имя приложения для аудита (по умолчанию "APPLICATION NAME FOR AUDIT")
trustStorePath: "ssl/kafka.jks" # путь от inventories/_стенд_/ до файла с trustStore
trustStorePassword: "SeCuRePaSsWorD2" # пароль от trustStore
keyStorePath: "ssl/kafka.jks" # путь от inventories/_стенд_/ до файла с keyStore
keyStorePassword: "SeCuRePaSsWorD2" # пароль от keyStore
keyPassword: "SeCuRePaSsWorD2" # пароль от ключа в хранилище
Протокол безопасности SSL__ZK_mTLS_WITH_AUTH__KAFKA_SSL_WITH_AUTH__SECMAN#
При использовании профиля SSL__ZK_mTLS_WITH_AUTH__KAFKA_SSL_WITH_AUTH__SECMAN подготовка сертификатов X509 не требуется. Управление сертификатами и секретами происходит с помощью Secret Management System (SecMan).
Создайте файл /tmp/installer/ansible/inventories/DEV/group_vars/all/vars.yaml и заполните его по шаблону:
# Переменные, доступные для всех ролей #
tmp_dir: /tmp/installer # путь к временной директории на конечных серверах
wait_for_start: 120 # время в секундах на корректный старт приложения (падает с ошибкой при превышении)
security: SSL__ZK_mTLS_WITH_AUTH__KAFKA_SSL_WITH_AUTH__SECMAN # протокол безопасности
kafka_user: kafka # имя пользователя от имени которого запускается Kafka
kafka_group: kafka # имя группы от имени которой запускается kafka
enabled_service: true # создание сервиса и настройка сервиса ../helper/create_service.yml
crxsr:
distr: distrib.zip # имя zip архива с дистрибутивом, размещенного в ./ansible/files/
installdir: /opt/Apache/kafka # абсолютный путь на конечном сервере к приложению
cleanLog: true # очистить путь к логам при установке
prop_var:
"server_port": 8081 # порт на котором работает CRXSR
sr_user: # пользователи в schema-registry
admin:
psw: "SeCuRePaSsWorD2"
role: 'ROLE_ADMIN'
user:
psw: "SeCuRePaSsWorD2"
role: 'ROLE_USER'
kafka:
trustStorePath: "ssl/truststore.kafka.jks" # путь от inventories/_стенд_/ до файла с trustStore (или абсолютный на сервере при needUploadJks: false)
trustStorePassword: "<truststore-password>" # пароль от trustStore
config_secman:
endpoint: 'secman_url' # адрес хоста SecMan
namespace: 'name_space' # пространство, в котором хранятся секреты
path: 'container_path' # путь к контейнеру с секретами
secret_name: 'container_name' # имя контейнера с секретами
opentimeout: '20' # время ожидания соединения (секунды)
readtimeout: '20' # время ожидания получения (секунды)
tokenttl: '120' # время жизни токена (секунды)
fetchrole: 'role-secman-CA-name' # имя роли для работы с удостоверяющим центром (CA) SECMAN
fetchmount: 'PKI' # (путь) адрес CA SECMAN
fetchcn: 'test.corax' # Common Name в сертификате
put_enable: false # включение создания контейнера секретов в SecMan
connectDict: # данные для авторизации в SecMan
role_id: "role_id_xxx"
secret_id: "secret_id_xxx"
Протокол безопасности SSL__ZK_mTLS_WITH_AUTH__KAFKA_SSL_WITH_AUTH__AUDIT__SECMAN#
При использовании профиля SSL__ZK_mTLS_WITH_AUTH__KAFKA_SSL_WITH_AUTH__AUDIT__SECMAN подготовка сертификатов X509 не требуется. Управление сертификатами и секретами происходит с помощью Secret Management System (SecMan).
Создайте файл /tmp/installer/ansible/inventories/DEV/group_vars/all/vars.yaml и заполните его по шаблону:
# Переменные, доступные для всех ролей #
tmp_dir: /tmp/installer # путь к временной директории на конечных серверах
wait_for_start: 120 # время в секундах на корректный старт приложения (падает с ошибкой при превышении)
security: SSL__ZK_mTLS_WITH_AUTH__KAFKA_SSL_WITH_AUTH # протокол безопасности
kafka_user: kafka # имя пользователя от имени которого запускается Kafka
kafka_group: kafka # имя группы от имени которой запускается kafka
enabled_service: true # создание сервиса и настройка сервиса ../helper/create_service.yml
crxsr:
distr: distrib.zip # имя zip архива с дистрибутивом, размещенного в ./ansible/files/
installdir: /opt/Apache/kafka # абсолютный путь на конечном сервере к приложению
cleanLog: true # очистить путь к логам при установке
prop_var:
"server_port": 8081 # порт на котором работает CRXSR
sr_user: # пользователи в schema-registry
admin:
psw: "SeCuRePaSsWorD2"
role: 'ROLE_ADMIN'
user:
psw: "SeCuRePaSsWorD2"
role: 'ROLE_USER'
kafka:
trustStorePath: "ssl/truststore.kafka.jks" # путь от inventories/_стенд_/ до файла с trustStore (или абсолютный на сервере при needUploadJks: false)
trustStorePassword: "<truststore-password>" # пароль от trustStore
config_audit: # настройки аудита
url: "http://localhost:8084" # префикс url для отправки событий аудита
system_id: "CORAX" # Имя приложения для аудита (по умолчанию "APPLICATION NAME FOR AUDIT")
trustStorePath: "ssl/kafka.jks" # путь от inventories/_стенд_/ до файла с trustStore
trustStorePassword: "SeCuRePaSsWorD2" # пароль от trustStore
keyStorePath: "ssl/kafka.jks" # путь от inventories/_стенд_/ до файла с keyStore
keyStorePassword: "SeCuRePaSsWorD2" # пароль от keyStore
keyPassword: "SeCuRePaSsWorD2" # пароль от ключа в хранилище
config_secman:
endpoint: 'secman_url' # адрес хоста SecMan
namespace: 'name_space' # пространство, в котором хранятся секреты
path: 'container_path' # путь к контейнеру с секретами
secret_name: 'container_name' # имя контейнера с секретами
opentimeout: '20' # время ожидания соединения (секунды)
readtimeout: '20' # время ожидания получения (секунды)
tokenttl: '120' # время жизни токена (секунды)
fetchrole: 'role-secman-CA-name' # имя роли для работы с удостоверяющим центром (CA) SECMAN
fetchmount: 'PKI' # (путь) адрес CA SECMAN
fetchcn: 'test.corax' # Common Name в сертификате
put_enable: false # включение создания контейнера секретов в SecMan
connectDict: # данные для авторизации в SecMan
role_id: "role_id_xxx"
secret_id: "secret_id_xxx"
Запуск ansible-playbook#
Перейдите в каталог со сценариями ansible, выполнив команду
cd /tmp/installer/ansible/.Выполните ansible-playbook командой
ansible-playbook -i ./inventories/DEV/inventory.ini ./playbooks/crxsr.ymlи дождитесь завершения выполнения.
В случае успешного выполнения в stdout, в разделе PLAY RECAP, должно появиться unreachable=0 failed=0 напротив каждого хоста.

Справочная информация#
Переменные роли#
Описания и значения по умолчанию для переменных можно найти в defaults/main:
Файл |
Описание |
|---|---|
|
Переменные для установки crxsr |
Описание задач#
Файл |
Описание |
|---|---|
|
Основной playbook который включает все остальные в зависимости от параметра |
|
Добавляет основные свойства (порт, имя лога, путь к файлу с параметрами) в |
|
Добавляет свойства для работы по SSL в |
|
Добавляет свойства для авторизации в |
|
Добавляет свойства для подключения к consumer в |
|
Добавляет свойства для подключения к producer в |
|
Добавляет свойства для получения секретов из Secret Management System в |
|
Включает авторизацию по ключам, добавляет свойства в |
|
При использовании профиля с аудитом, конфигурирует подключение к аудиту |
|
При использовании профиля с авторизацией, конфигурирует |
|
Запускает git scrxsr |
|
Останавливает crxsr |
|
Задачу необходимо запускать на хостах с Kafka, для внесения изменений в |
Используемые теги#
Имя тега |
Описание |
|---|---|
root |
Устанавливает Java и создает: пользователя-группы ОС, сервис crx-sr, каталог |
install |
Останавливает crxsr, загружает дистрибутив на хосты, распаковывает дистрибутив, конфигурирует, стартует |
configure |
Добавляет или исправляет свойства в файле параметров в зависимости от профиля (Security) |
distribute |
Загружает дистрибутив на хосты |
start |
Запускает crxsr, проверяет доступность порта и ищет в логе строку |
stop |
Останавливает crxsr |
status |
Проверяет доступность по порту crxsr |
Пример inventory.ini#
[all:vars]
ansible_connection=ssh #Способ подключения к серверу
ansible_user=sshlogin #Логин пользователя для доступа по ssh
ansible_ssh_pass=sshpsw #Пароль пользователя для доступа по ssh
[crxsr]
10.XX.XX.XX
[kafka]
10.XX.XX.XX
[zookeeper]
10.XX.XX.XX
Пример playbook#
---
- hosts: all
tasks:
### Обязательна т.к. регистрирует переменные:
### kafka_port_list, zk_port_list
- include_tasks: "../helper/get_default_vars.yml"
tags: always
- name: "block schema-registry"
when: groups['crxsr'] is defined
block:
- include_role:
name: crxsr
when: inventory_hostname in groups['crxsr']
- include_role:
name: "crxsr"
tasks_from: crxsr_kafka_prop.yml
when: inventory_hostname in groups['kafka']
- name: "brokers restart"
block:
- name: "restart {{ srv }}"
include_role:
name: "kafka"
tasks_from: "kafka_restart_each_brocker.yml"
vars:
each_brocker: "{{ srv }}"
loop: "{{ groups['kafka'] }}"
loop_control:
loop_var: srv
when: inventory_hostname in groups['kafka']