Экспорт данных#

На этом этапе происходит сбор исходных данных и формируется миграционный артефакт – единый архив с копиями баз данных, секретными ключами и пользовательскими конфигурациями, необходимыми для восстановления платформы в кластере Kubernetes.

Цель этапа:

  • собрать данные, необходимые для подключения к базам данных;

  • создать копии всех баз данных с помощью утилиты pg_dump;

  • собрать секретные ключи компонентов;

  • экспортировать пользовательские конфигурации;

  • упаковать все данные в единый переносимый артефакт.

Сбор информации о базах данных#

Перед созданием резервной копии и подготовкой секретов Kubernetes необходимо собрать полную информацию о всех базах данных, которые использует текущая платформа. Неполные или неточные данные могут привести к ошибкам при восстановлении в кластере Kubernetes.

Вам потребуются следующие данные:

  • список баз данных и пользователей с административными привилегиями;

  • параметры подключения.

Для удобства следует собрать эти данные в сводную таблицу для передачи ее на шаг подготовки секретов в Kubernetes.

Предварительные требования#

Сбор данных предъявляет следующие требования:

  • доступ по SSH к узлам (Automation Controller, Private Automation Hub, Platform Gateway, Event-Driven Automation, узел СУБД);

  • доступ к СУБД с привилегиями администратора;

  • на узле, где выполняете сбор информации, доступны утилиты ssh, psql, grep, jq.

Сбор списка баз данных и ролей#

Получите необходимую информацию о базах данных и их пользователях:

  1. Подключитесь к узлу, где развернута СУБД PostgreSQL, и выполните команду для получения списка баз:

    ssh -i <ssh_key> <ssh_user>@<pg_host_ip> \
      "sudo -u postgres psql -p <pg_port> -c '\l'" | grep -E 'Name|awx|automation'
    
  2. Получите список пользователей и их ролей в PostgreSQL:

    ssh -i <ssh_key> <ssh_user>@<pg_host_ip> \
      "sudo -u postgres psql -p <pg_port> -c '\du'" | grep -v 'postgres'
    

Поиск паролей в конфигурационных файлах#

Найдите в конфигурационных файлах компонентов параметры database, host, port, user, password. Выполняйте команды на соответствующих узлах:

  • Platform Gateway:

    ssh -i <ssh_key> <ssh_user>@<gateway_ip> \
      "sudo grep -iE 'database|password|host|port|user' /etc/astra-automation/gateway/settings.py 2>/dev/null | grep -v '^#'"
    
  • Automation Controller:

    ssh -i <ssh_key> <ssh_user>@<controller_ip> \
      "sudo grep -iE 'database|password|host|port|user' /etc/tower/conf.d/postgres.py 2>/dev/null || \
       sudo grep -iE 'database|password|host|port|user' /etc/tower/settings.py 2>/dev/null"
    
  • Private Automation Hub:

    ssh -i <ssh_key> <ssh_user>@<hub_ip> \
      "sudo grep -i 'DATABASES' -A 20 /etc/pulp/settings.py 2>/dev/null"
    
  • Контроллер Event-Driven Automation:

    ssh -i <ssh_key> <ssh_user>@<eda_ip> \
      "sudo grep -iE 'database|password|host|port|user' /etc/astra-automation/eda/settings.yaml 2>/dev/null | grep -v '^#'"
    

Сводная таблица#

Сохраните собранные данные в одном файле, например:

database-info.txt#
Component    | DB Name                  | DB User                | DB Password  | DB Host        | DB Port
-------------|--------------------------|------------------------|--------------|----------------|---------
Controller   | awx                      | awx                    | <password>   | <pg_host_ip>   | 5432
Hub          | automationhub            | automationhub          | <password>   | <pg_host_ip>   | 5432
Gateway      | automationgateway        | automationgateway      | <password>   | <pg_host_ip>   | 5432
EDA          | automationedacontroller  | automationedacontroller| <password>   | <pg_host_ip>   | 5432
PostgreSQL   | postgres                 | postgres               | <password>   | <pg_host_ip>   | 5432

Подготовка структуры экспорта#

Выполните следующие операции на установочном узле исходной платформы:

  1. Подключитесь к установочному узлу по SSH:

    ssh -i <ssh_key> <ssh_user>@<node_ip>
    
  2. Создайте структуру каталогов:

    mkdir -p migration-export/{controller/custom_configs,hub,gateway,eda}
    
  3. Перейдите в каталог migration-export/:

    cd migration-export
    
  4. Создайте файл для хранения секретов, в котором вы будете коллекционировать секреты из текущей платформы:

    touch secrets.yml
    

В результате выполнения этой серии команд вы получаете следующую структуру:

migration-export/
   ├── controller
   |      └── custom_configs
   ├── eda
   ├── gateway
   └── hub
   └── secrets.yml

Остановка сервисов#

Для предотвращения изменения данных остановите сервисы всех компонентов.

Важно

Службы PostgreSQL и Redis останавливать нельзя. Они необходимы для создания копий.

На каждом узле выполните соответствующую команду:

  • Platform Gateway:

    ssh -i <ssh_key> <ssh_user>@<gateway_ip> \
      "sudo supervisorctl stop all"
    
  • Automation Controller:

    ssh -i <ssh_key> <ssh_user>@<controller_ip> \
      "sudo supervisorctl stop all"
    
  • Private Automation Hub:

    ssh -i <ssh_key> <ssh_user>@<hub_ip> \
      "sudo systemctl stop pulpcore-api pulpcore-content pulpcore-worker@1 pulpcore-worker@2"
    
  • Event-Driven Automation:

    ssh -i <ssh_key> <ssh_user>@<eda_ip> \
      "sudo systemctl stop automation-eda-controller.target"
    

Создание копий баз данных#

Необходимо создать и сохранить копии баз данных платформы для последующего восстановления данных в новой среде.

Проверка размера баз данных#

Перед созданием копий убедитесь, что на файловой системе достаточно свободного места:

ssh -i <ssh_key> <ssh_user>@<pg_host_ip> \
  "sudo -u postgres psql -p <pg_port> -c '\l+'"

Создание копий баз данных#

Используя подключение по SSH к серверу PostgreSQL, создайте копии баз данных и сохраните их на локальном узле в подготовленной структуре каталогов.

  • Platform Gateway:

    ssh -i <ssh_key> <ssh_user>@<pg_host_ip> \
      "sudo -u postgres pg_dump -F c automationgateway" > gateway/gateway.pgc
    
  • Automation Controller:

    ssh -i <ssh_key> <ssh_user>@<pg_host_ip> \
      "sudo -u postgres pg_dump -F c awx" > controller/controller.pgc
    
  • Private Automation Hub:

    ssh -i <ssh_key> <ssh_user>@<pg_host_ip> \
      "sudo -u postgres pg_dump -F c automationhub" > hub/hub.pgc
    
  • Event-Driven Automation:

    ssh -i <ssh_key> <ssh_user>@<pg_host_ip> \
      "sudo -u postgres pg_dump -F c automationedacontroller" > eda/eda.pgc
    

Проверка копий#

Проверьте готовность созданных копий:

  1. Убедитесь, что копии созданы и имеют ненулевой размер:

    ls -lh */*.pgc
    
  2. Проверьте тип файлов:

    file */*.pgc
    

Ожидаемый результат для каждого файла:

PostgreSQL custom database dump - vX.Y

Сбор секретных ключей#

Секретные ключи необходимы для шифрации и дешифрации данных. Без них невозможно будет запустить сервисы после восстановления баз данных. Выведите значения секретных ключей и соберите их в файле secrets.yml, созданном ранее:

  • Platform Gateway:

    ssh -i <ssh_key> <ssh_user>@<gateway_ip> \
      "sudo cat /etc/astra-automation/gateway/SECRET_KEY"
    

    Добавьте полученное значения в поле gateway_secret_key в файле secrets.yml.

  • Automation Controller:

    ssh -i <ssh_key> <ssh_user>@<controller_ip> \
      "sudo cat /etc/tower/SECRET_KEY"
    

    Добавьте полученное значения в поле controller_secret_key в файле secrets.yml.

  • Private Automation Hub:

    ssh -i <ssh_key> <ssh_user>@<hub_ip> \
      "sudo grep SECRET_KEY /etc/pulp/settings.py"
    

    Добавьте полученное значения в поле hub_secret_key в файле secrets.yml.

    ssh -i <ssh_key> <ssh_user>@<hub_ip> \
      "sudo cat /etc/pulp/certs/database_fields.symmetric.key"
    

    Добавьте полученное значения в поле hub_db_fields_encryption_key в файле secrets.yml.

  • Event-Driven Automation:

    ssh -i <ssh_key> <ssh_user>@<eda_ip> \
      "sudo cat /etc/astra-automation/eda/SECRET_KEY"
    

    Добавьте полученное значения в поле eda_secret_key в файле secrets.yml.

Экспорт пользовательских конфигураций#

Если в платформе используются пользовательские настройки Automation Controller, сохраните их отдельно.

Примечание

Файлы, управляемые установщиком, копировать нельзя:

  • postgres.py;

  • channels.py;

  • caching.py;

  • cluster_host_id.py.

Создайте архив с пользовательскими конфигурациями (файлы custom_*.py), передайте его на локальную машину, распакуйте и сохраните в локальном каталоге controller/custom_configs/:

ssh -i <ssh_key> <ssh_user>@<controller_ip> \
  "sudo tar czf - -C /etc/tower/conf.d custom_*.py 2>/dev/null" \
  | tar xzf - -C controller/custom_configs/ || true

Создание файла manifest.yml#

Создайте файл manifest.yml с описанием исходной инфраструктуры:

---
aap_version: 2.0
platform: vm
source_topology:
  bastion: bastion (<installation_node_ip>)
  gateway: gw1 (<gateway_ip>)
  controller: ac-01 (<controller_ip>)
  hub: hub01 (<pah_ip>)
  eda: eda01 (<eda_ip>)
  database: db (<db_ip>)
  execution_node: ex01 (ex_ip)
components:
  - name: gateway
    database: automationgateway
  - name: controller
    database: awx
  - name: hub
    database: automationhub
  - name: eda
    database: automationedacontroller
migration_date: $(date +%Y-%m-%d)

Создание контрольных сумм#

Создайте файл sha256sum.txt с контрольными суммами для всех копий:

  1. Удалите файл контрольных сумм, если он уже существует:

    [ -f sha256sum.txt ] && rm -f sha256sum.txt
    
  2. Сформируйте контрольные суммы для всех копий баз данных и файлов конфигурации:

    find . -type f \( -name "*.pgc" -o -name "*.yml" \) \
      -exec sha256sum {} \; >> sha256sum.txt
    
  3. Проверьте содержимое файла:

    cat sha256sum.txt
    

Упаковка артефакта#

Все собранные данные упакуйте в архив:

  1. Создайте архив:

    tar czf artifact.tar.gz migration-export/
    
  2. Создайте контрольную сумму архива:

    sha256sum artifact.tar.gz > artifact.tar.gz.sha256
    
  3. Проверьте целостность:

    sha256sum --check artifact.tar.gz.sha256
    

Копирование артефакта#

Если вы создали артефакт на отдельном узле, передайте его на установочный узел, который вы будете использовать для управления Kubernetes:

scp [-i <ssh_key>] artifact.tar.gz artifact.tar.gz.sha256 <ssh_user>@<node_ip>:/tmp/