Установка платформы Tantor на сервера (виртуальные машины) с помощью Ansible

В этом разделе описан порядок установки Платформы на сервера (виртуальные машины) с помощью средств автоматизации на базе Ansible.

Данный архив служит для установки Платформы.

Далее по тексту будут представлены примеры вводимых в терминале команд, необходимых для подготовки SSH-сессии, проверки корректности настроек ansible и запуска playbook. В качестве примера пользователя в них будет использоваться учётная запись admin_user. При запуске команд в контуре Заказчика данный пользователь должен быть изменён на учётную запись, имеющую доступ по SSH ко всем серверам (виртуальным машинам), указанным в inventory, а также доступ в привилегированный режим (root).

Подготовительные действия

Установка модулей Платформы Тантор будет происходить в следующем порядке:

  1. Operdb - храненение данных Платформы.

  2. Operdb replication - репликация базы данных Платформы.

  3. Tensordb - база данных для анализа информации.

  4. Tensordb replication - репликация базы данных для анализа.

  5. Flyway migrations - сервис миграции во внутренние базы данных Платформы.

  6. Pgbouncer - управление пулом соединений внутренних баз данных Платформы.

  7. Nats cluster - брокер сообщений для компонентов системы.

  8. Nats nginx proxy - балансировщик соединений к NATS.

  9. Backend (включает в себя keeper, pgconfigurator) - сервер API Платформы, keeper - передает данные от агентов во внутренние базы данных Платформы, pgconfigurator - сервис автоматизированного конфигурирования PostgreSQL.

  10. Pgexplain - сервис анализа запросов.

  11. Frontend - пользовательский интерфейс Платформы.

  12. 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:

  1. Распакуйте предоставленный ООО «ТАНТОР ЛАБС» архив в любой каталог файловой системы (рекомендуемое место размещения /opt/tantor/) на сервере (виртуальной машине) Admin server (ссылка на скачивание).

  2. Перейдите в созданный каталог и заполните файл 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
  1. Добавьте содержимое в 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.

  2. Настройте возможность подключения по SSH-ключу ко всем серверам (виртуальным машинам) из файла inventory пользователю admin_user:

ssh-agent bash
ssh-add ~/.ssh/<admin_user_private_key>
  1. Плейбук рассчитан на запуск с узла, находящегося в группе flyway. Этот узел считается административным узлом и может быть использован в качестве промежуточного устройства (jump box или jump device) для установки и Платформы.

  2. После успешного завершения работы плейбука Платформа будет доступна по 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». Данный файл находится в корневом каталоге распакованного архива. Подключения логирования в систему сбора логов, установленную в контуре Заказчика, осуществляются самим Заказчиком.