Установка платформы Tantor на сервера (виртуальные машины) с помощью Ansible
В этом разделе описан порядок установки Платформы на сервера (виртуальные машины) с помощью средств автоматизации на базе Ansible.
Данный архив служит для установки Платформы.
Далее по тексту будут представлены примеры вводимых в терминале команд, необходимых для подготовки SSH-сессии, проверки корректности настроек ansible и запуска playbook. В качестве примера пользователя в них будет использоваться учётная запись admin_user. При запуске команд в контуре Заказчика данный пользователь должен быть изменён на учётную запись, имеющую доступ по SSH ко всем серверам (виртуальным машинам), указанным в inventory, а также доступ в привилегированный режим (root).
Подготовительные действия
Установка модулей Платформы Тантор будет происходить в следующем порядке:
Operdb - храненение данных Платформы.
Operdb replication - репликация базы данных Платформы.
Tensordb - база данных для анализа информации.
Tensordb replication - репликация базы данных для анализа.
Flyway migrations - сервис миграции во внутренние базы данных Платформы.
Pgbouncer - управление пулом соединений внутренних баз данных Платформы.
Nats cluster - брокер сообщений для компонентов системы.
Nats nginx proxy - балансировщик соединений к NATS.
Backend (включает в себя keeper, pgconfigurator) - сервер API Платформы, keeper - передает данные от агентов во внутренние базы данных Платформы, pgconfigurator - сервис автоматизированного конфигурирования PostgreSQL.
Pgexplain - сервис анализа запросов.
Frontend - пользовательский интерфейс Платформы.
Reverse Proxy - балансировщик соединений пользователей к Платформе.
Перед запуском Ansible playbook следует преднастроить сервера (виртуальные машины) и установить программное обеспечение.
Рис.1 Схема взаимодействия модулей Платформы Tantor
Минимальные аппаратные требования
Для развёртывания компонентов Платформы требуется группа серверов (виртуальных машин) со следующей минимальной спецификацией:
CPU: 4
Оперативная память: 16 GB
Дисковое пространство: 40 GB
Установка платформы возможна на любое количество серверов (виртуальных машин). Для режима отказоустойчивости (High Availability) рекомендуется использовать не менее 13 узлов, поделённых на группы в следующем порядке:
два сервера под группу OperDB;
два сервера под группу TensorDB;
два сервера под группу App (Backend, Frontend, Pgexplain);
один сервер под Reverse Proxy;
один сервер под Nats nginx proxy;
три сервера под группу Nats;
один узел под Admin_server;
Минимальные программные требования
Для достижения полного и корректного функционирования Платформы необходимо убедиться в том, что на каждом сервере (виртуальной машине) группы стоит операционная система Astra linux 1.7.4, или нужно установить её, а также все пакеты, которые указаны в Установке необходимого программного обеспечения.
Открытые порты
На каждом сервере (виртуальной машине) группы должны быть открыты следующие рекомендуемые порты (порты по умолчанию используемые в модулях платформы, вы можете использовать порты принятые в вашей организации. Порты указываются в файле inventory):
Группа серверов Operdb: server port 25432
Группа серверов Operdb replica: server port 25432
Группа серверов Tensordb: server port 5432
Группа серверов Tensordb replica: server port 5432
Группа серверов Pgbouncer server port 15432
Группа серверов Nats cluster server port 6222 (each server)
Группа серверов Nats nginx server port 4222, 14222
Группа серверов App server ports: 5666 (backend), 7777 (internal pgconfigurator) 4200 (pgexplain), 8080 (frontend), ,
Группа серверов Reverse_proxy: 443 (https), 80 (http), 5666 (upstream to backend), 8081 (pmaagent download port), pgalerts 5667
Установка необходимого программного обеспечения
На сервере (виртуальной машине) каждой группы должно быть предустановлено следующее программное обеспечение:
- Operdb
python3
python3-psycopg2
xz-utils
python-apt
gcc-10-base_10.2.1
libgcc-s1_10.2.1
libllvm9_1_9
libstdc++6_10.2.1
libclang_cpp9_1_9
llvm_9_tools_1_9Platform
llvm_9_runtime_1_9
llvm_9_1_9
llvm_9_dev_1_9
postgresql-11_11.20
- Tensordb
python3
python3-psycopg2
libllvm11
libpython3.7
libxslt1.1
libz3-4
xz-utils
python-apt
tantor-be-server-15_15.2.3
- Flyway (Admin Server)
python-apt
wget
libffi-dev
python3
python3-pip
git
sshpass
flyway-9.22.2
- Ansible 8.0.0 (Admin Server)
python3.9.1
- Pgbouncer
python-apt
pgbouncer
postgresql-client-11
- Nats
nats-server-v2.9.22
- Nats_nginx
python-apt
nginx
libnginx-mod-stream
- Backend
python-apt
python-setuptools
python3
python3-pip
python-apt
- pip
gunicorn
flask
psutil
nuitka
- Pgexplain
python-apt
libbrotli1
libuv1
wget
nodejs_18.17.1
- Frontend
nginx
python3
python-apt
- Reverse_proxy
nginx
Для автоматизации установки пакетов, приведенных выше, воспользуйтесь Рекомендацией по установке пакетов, необходимых для работы системы Tantor на серверах (виртуальных машинах).
Подготовка к запуску Ansible playbook
Порядок подготовки к запуску Ansible playbook:
Распакуйте предоставленный ООО «ТАНТОР ЛАБС» архив в любой каталог файловой системы (рекомендуемое место размещения /opt/tantor/) на сервере (виртуальной машине) Admin server (ссылка на скачивание).
Перейдите в созданный каталог и заполните файл inventory (располагается в каталоге playbook/inventory распакованного архива), который определяет все группы серверов (виртуальных машин). В этом файле необходимо указать доменные имена для каждой группы серверов (виртуальных машин).
При заполнении файла inventory придерживайтесь имеющейся структуры:
общий список групп серверов (виртуальных машин) Платформы;
переменные, доступные в каждом блоке установки;
именованные группы серверов (виртуальных машин), необходимые для установки конкретного модуля Платформы;
переменные, доступные в рамках конкретного модуля Платформы;
Пример заполнения файла представлен ниже. Убедитесь, что каждая группа серверов файла inventory имеет свой блок с соответствующими серверами (виртуальными адресами) DNS и их IP-адресами. В блоке [platform:vars] вы также можете настроить различные переменные окружения.
[platform:children] # общий список групп серверов operdb tensordb flyway nats nats_nginx backend frontend reverse_proxy pgbouncer pgexplain [platform:vars] operdb_replicator_pass = "qaw1234" # пароль пользователя replicator в базе operdb tnsdb_replicator_pass = "qaw1234" # пароль пользователя replicator в базе tensordb domain_name = "company.ru" #укажите доменное имя для Tantor platform pgexplain_worker_port = "4200" # порт для подключения к pgexplain nats_listen_port = "4222" # порт для подключения к кластеру NATS nats_nginx_listen_port = "14222" # порт для подключения к nginx для балансировки траффика к NATS pgbouncer_connect_port = "15432" # порт для подключения к NATS nats_cluster_name = "tantor" # название кластера NATS tenant_name = "pmm" # название тенанта backend_listen_port = "5666" # порт backend pgalerts_listen_port = "5667" # порт pgalerts reverse_proxy_http_port = "80" # порт для подключения к платформе по протоколу http reverse_proxy_https_port = "443" # порт для подключения к платформе по протоколу https pmaagent_download_port = "8081" # порт для reverse_proxy, по которому происходит скачивание агента frontend_listen_port = "8080" # порт для подключения к платформе по протоколу http operdb_database = "pma" # название базы данных к тенанту operdb_port = "25432" # порт для подключения к operdb operdb_user = "pmm" # пользователь базы данных operdb operdb_user_pass = "MGFjMTg5NjcxMzgw" # пароль для подключения к базе данных operdb tnsdb_database = "pg-monitor" # база данных tensordb tnsdb_port = "5432" # порт для подключения к tensordb tnsdb_user = "monitor" # пользователь для подключения к tensordb tnsdb_user_pass = "bHEKRdsP86mJ7e5p" # пароль для подключения к tnsdb от tnsdb_user pgexplain_name = "explain" # название модуля pgexplain platform_version= "3.2.0" # версия устанавливаемой платформы [operdb:children] # группа серверов для Operdb operdb_replicas operdb_master [operdb_master] hostname.company_domain.ru ansible_host=xx.xx.xx.xx [operdb_replicas] hostname.company_domain.ru ansible_host=xx.xx.xx.xx [tensordb:children] # группа серверов для Tensordb tensordb_replicas tensordb_master [tensordb_master] hostname.company_domain.ru ansible_host=xx.xx.xx.xx [tensordb_replicas] hostname.company_domain.ru ansible_host=xx.xx.xx.xx [flyway] # данный компонент устанавливается на Admin server hostname.company_domain.ru ansible_host=xx.xx.xx.xx [nats] # группа серверов для NATS. в данном блоке должно быть минимум 3 сервера (виртуальных машины) hostname.company_domain.ru ansible_host=xx.xx.xx.xx hostname.company_domain.ru ansible_host=xx.xx.xx.xx hostname.company_domain.ru ansible_host=xx.xx.xx.xx [nats:vars] # переменные для NATS nats_cluster_port = "6222" # порт для внутренней коммуникации нод кластера NATS nats_monitoring_port = "8222" # порт для мониторинга кластера NATS nats_username = "natsAdmin" # пользователь для подключения к кластеру NATS nats_password = "WnB3nnzZtDkEN" # пароль для подключения к кластеру NATS [nats_nginx] # если в блоке [nats] 3 сервера (виртуальные машины) - укажите в качестве хоста адрес последнего сервера (виртуальной машины) блока [nats] hostname.company_domain.ru ansible_host=xx.xx.xx.xx [backend] # группа серверов для Backend hostname.company_domain.ru ansible_host=xx.xx.xx.xx hostname.company_domain.ru ansible_host=xx.xx.xx.xx [backend:vars] # переменные для Backend jwt_secret_key = "MGFjMTg5NjcxMzgw" # используется в Unit файле backend server_nginx_secret_key = "MGFjMTg5NjcxMzgw" # любой ключ с минимальной длиной в 13 символов; используется в конфигурационном файле backend-а для скачивания агента [frontend] # группа серверов для Frontend hostname.company_domain.ru ansible_host=xx.xx.xx.xx hostname.company_domain.ru ansible_host=xx.xx.xx.xx [reverse_proxy] # сервер для Reverse Proxy hostname.company_domain.ru ansible_host=xx.xx.xx.xx [reverse_proxy:vars] # переменные для Reverse Proxy timeout = "1800" # время ожидания запроса nginx для роли revese_proxy backend_allow_network = "xx.xx.xx.0/24" # должно быть одинаковой с сетью группы backend service_pgalerts = pgalerts [pgbouncer] # сервер BGBouncer devops-pgbouncer.company_domain.ru ansible_host=xx.xx.xx.xx [pgexplain] # группа серверов PGExplain hostname.company_domain.ru ansible_host=xx.xx.xx.xx hostname.company_domain.ru ansible_host=xx.xx.xx.xx [pgexplain:vars] # переменные для PGExplain
Добавьте содержимое в pem-файлы (в каталоге local/certs/ распакованного архива). В указанном каталоге находятся сертификаты и приватные ключи для двух сервисов: nats и reverse_proxy. Сервис nats использует nats_fullchain.pem и nats_privkey.pem для построения защищённых маршрутов к серверам (виртуальным машинам) кластера nats. Сервис reverse_proxy использует nginx_reverse_proxy_fullchain.pem и nginx_reverse_proxy_privkey.pem для формирования защищённого подключения к веб-интерфейсу Платформы.
Для целей тестирования можно сгенерировать самоподписные сертификаты по следующей инструкции (в примере ниже ключи генерируются для сервиса NATS):
# генерируем приватный ключ openssl genrsa -des3 -out myCA.key 2048 # генерируем корневой сертификат openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem # кладём файл (myCA.pem) в каталог задействованных узлов (/usr/local/share/ca-certificates), меняя ему расширение на .crt, и выполняем команду update-ca-certificates # генерируем приватный ключ для nats openssl genrsa -out nats_priv.key 2048 # создаём запрос на подпись openssl req -new -key nats_priv.key -out nats_cert.csr Создаём конфигурационный файл nats.ext с содержимым authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = *.tantorlabs.ru # создаём сертификат на nats_cert.crt openssl x509 -req -in nats_cert.csr -CA myCA.pem -CAkey myCA.key \ -CAcreateserial -out nats_cert.crt -days 825 -sha256 -extfile nats.ex
Скопируйте содержимое nats_cert.crt и добавьте в файл nats_fullchain.pem. Содержимое файла nats_priv.key добавьте в nats_privkey.pem.
Настройте возможность подключения по SSH-ключу ко всем серверам (виртуальным машинам) из файла inventory пользователю admin_user:
ssh-agent bash ssh-add ~/.ssh/<admin_user_private_key>
Плейбук рассчитан на запуск с узла, находящегося в группе flyway. Этот узел считается административным узлом и может быть использован в качестве промежуточного устройства (jump box или jump device) для установки и Платформы.
После успешного завершения работы плейбука Платформа будет доступна по IP адресу сервера из группы reverse_proxy. Имя ресурса формируется путём конкатенации значения переменных tenant_name и domain_name (в примере выше pmm.tantorlabs.ru). Необходимо создать А-запись в DNS сервере до начала установки.
Обязательным требованием к установке является связность серверов (виртуальных машин) посредством DNS.
Проверка доступности серверов
Запускать команды ниже рекомендуется из корневого каталога распакованного архива. В случае запуска из иного каталога после флага «-i» укажите полный путь к inventory файлу.
После заполнения файла inventory рекомендуется убедиться, что все серверы доступны для подключения к ним по SSH с указанием требуемого пользователя. Для этого выполните следующую команду в терминале:
ansible platform -i playbook/inventory -m ping -u admin_user
Результатом выполнения команды выше будет ответ от каждого из доступных серверов (виртуальных машин) в следующем формате:
<device_fqdn_name> | SUCCESS => {ssh-add ~/.ssh/<admin_user_private_key> "ansible_facts": {
"discovered_interpreter_python": "/usr/bin/<host_python_version>"
},
"changed": false,
"ping": "pong"
}
Данный вывод для каждого сервера, описанного в файле inventory, означает успешное подключение к нему по SSH. Если в результате ответа от какого-либо сервера (виртуальной машины) сообщение отличалось от шаблона выше - проверьте возможность подключения к нему через ключ от имени пользователя, передаваемого при помощи флага «-u». При необходимости подключаться только с вводом пароля (без использования ключей) - необходимо добавлять флаги «-kK» к запуску команд и вводить пароль для SSH-подключения и для перехода пользователя в привилегированный режим (root):
ansible platform -i playbook/inventory -m ping -u admin_user -kK
Запуск установки Платформы
После успешной проверки доступности серверов вы можете запустить установку всех модулей. Для этого выполните следующую команду в терминале:
ansible-playbook -i playbook/inventory -u admin_user playbook/platform.yml
Либо необходимо добавить флаги «-kK» для интерактивного ввода паролей для SSH подключения и для перехода пользователя в привилегированный режим (root):
ansible-playbook -i playbook/inventory -u admin_user playbook/platform.yml -kK
Если вам нужно установить только определенный модуль, вы можете использовать флаг «-l» с указанием имени модуля. Например:
ansible-playbook -i playbook/inventory -u admin_user playbook/platform.yml -l backend
Эта команда запустит установку только модуля Backend. Если вам нужно установить несколько модулей, вы можете перечислить модули, разделяя их запятой. Например:
ansible-playbook -i playbook/inventory -u admin_user playbook/platform.yml -l backend,frontend,reverse_proxy
Эта команда запустит установку модулей Backend, Frontend и Reverse Proxy. После запуска установки Ansible выполнит задачи и роли, определенные в файле platform.yml, на каждом сервере в соответствии с вашими настройками.
Успешным выполнением запуска Ansible playbook является отсутствие ошибок в потоке вывода в терминале.
Логирование действий в процессе установки Платформы
Все данные, полученные в процессе запуска файла playbook, сохраняются в файле ansible.log, располагающемся в корневом каталоге распакованного архива. Изменение пути к лог файлу доступно путём редактирования соответствующего поля в файле конфигураций ansible - «ansible.cfg». Данный файл находится в корневом каталоге распакованного архива. Подключения логирования в систему сбора логов, установленную в контуре Заказчика, осуществляются самим Заказчиком.