Импорт в Astra Automation#

Импорт выполняется в два шага, отражающих архитектуру Astra Automation:

  1. Платформенные ресурсы – организации, пользователи, команды – создаются через API шлюза с помощью коллекции ansible.gateway_configuration. Шлюз автоматически синхронизирует их со всеми компонентами платформы.

  2. Ресурсы Automation Controller – полномочия, проекты, инвентарные списки, шаблоны и другие ресурсы – создаются через API контроллера с помощью коллекции infra.controller_configuration.

Оба шага идемпотентны: повторный запуск безопасен, существующие ресурсы обновляются без дублирования.

Шаг 1: платформенные ресурсы#

Создайте файл сценариев (playbook) import-platform.yml:

---
- name: Импорт платформенных объектов в шлюз платформы
  hosts: localhost
  connection: local
  gather_facts: false
  vars:
    gateway_hostname: "{{ aa_url }}"
    gateway_oauthtoken: "{{ aa_token }}"
    gateway_validate_certs: false
    export_dir: /var/tmp/awx-export
  tasks:
    - name: Загрузка экспортированных организаций, пользователей и команд
      ansible.builtin.include_vars:
        file: "{{ export_dir }}/{{ item }}.yaml"
      loop:
        - organizations
        - users
        - teams

    - name: Преобразование пользователей в формат шлюза
      ansible.builtin.set_fact:
        gateway_user_accounts: "{{ gateway_user_accounts | default([]) + [{
          'username': item.username,
          'password': item.password,
          'email': item.email,
          'first_name': item.first_name,
          'last_name': item.last_name,
          'is_superuser': item.superuser | bool}] }}"
      loop: "{{ controller_user_accounts | default([]) }}"

    - name: Создание организаций
      ansible.builtin.include_role:
        name: ansible.gateway_configuration.organizations
      vars:
        gateway_organizations: "{{ controller_organizations | default([]) }}"

    - name: Создание пользователей
      ansible.builtin.include_role:
        name: ansible.gateway_configuration.users

    - name: Создание команд пользователей
      ansible.builtin.include_role:
        name: ansible.gateway_configuration.teams
      vars:
        gateway_teams: "{{ controller_teams | default([]) }}"

Запустите набор сценариев:

ansible-playbook import-platform.yml \
   -e aa_url=https://<aa-gateway> \
   -e aa_token=<gateway-token> \
   -e export_dir=/var/tmp/awx-export

Здесь:

  • <aa-gateway> – адрес шлюза Astra Automation;

  • <gateway-token> – токен доступа шлюза, созданный на этапе подготовки.

Созданные объекты автоматически появляются в шлюзе и контроллере платформы. Проверить синхронизацию можно запросом списка организаций через API контроллера:

curl -k -H "Authorization: Bearer <gateway-token>" \
   https://<aa-gateway>/api/controller/v2/organizations/

Шаг 2: ресурсы Automation Controller#

Создайте файл сценариев import.yml:

---
- name: Импорт объектов в Astra Automation
  hosts: localhost
  connection: local
  gather_facts: false
  environment:
    CONTROLLER_OPTIONAL_API_URLPATTERN_PREFIX: /api/controller/
  vars:
    controller_hostname: "{{ aa_url }}"
    controller_oauthtoken: "{{ aa_token }}"
    controller_validate_certs: false
    export_dir: /var/tmp/awx-export
  pre_tasks:
    - name: Загрузка файлов экспорта (кроме платформенных ресурсов и назначений ролей)
      ansible.builtin.include_vars:
        file: "{{ item }}"
      loop: "{{ lookup('ansible.builtin.fileglob', export_dir ~ '/*.yaml', wantlist=True)
                | reject('search', '/(organizations|users|teams|user_roles|team_roles).yaml$') | list }}"
  roles:
    - infra.controller_configuration.dispatch
  post_tasks:
    - name: Импорт назначений ролей пользователей и команд
      ansible.builtin.include_role:
        name: infra.controller_configuration.roles
      vars:
        controller_roles: "{{ (lookup('ansible.builtin.file', item) | from_yaml).controller_roles | default([]) }}"
      loop:
        - "{{ export_dir }}/user_roles.yaml"
        - "{{ export_dir }}/team_roles.yaml"
      when: item is exists

Здесь:

  • CONTROLLER_OPTIONAL_API_URLPATTERN_PREFIX – переменная окружения, которая переключает коллекцию с пути /api/v2/ (AWX) на путь API контроллера Astra Automation /api/controller/;

  • файлы платформенных ресурсов исключаются из загрузки – они уже импортированы через шлюз;

  • назначения ролей импортируются последним шагом, когда все объекты уже созданы; файлы user_roles.yaml и team_roles.yaml загружаются по очереди, поскольку оба используют одну переменную controller_roles.

Запустите набор сценариев:

ansible-playbook import.yml \
   -e aa_url=https://<aa-gateway> \
   -e aa_token=<gateway-token> \
   -e export_dir=/var/tmp/awx-export

Роль dispatch применяет ресурсы в порядке зависимостей: метки, типы полномочий, полномочия, среды исполнения, шаблоны уведомлений, проекты, инвентарные списки, узлы, группы, шаблоны заданий, шаблоны потоков заданий, расписания. После создания проектов запускается их синхронизация с репозиториями.

Частичный импорт#

Для импорта только отдельных типов объектов переопределите список ролей диспетчера. Например, только полномочия и проекты:

ansible-playbook import.yml \
   -e aa_url=https://<aa-gateway> \
   -e aa_token=<gateway-token> \
   -e '{"controller_configuration_dispatcher_roles": [
         {"role": "credentials", "var": "controller_credentials", "tags": "credentials"},
         {"role": "projects", "var": "controller_projects", "tags": "projects"}]}'

Диагностика ошибок импорта#

Если импорт завершается ошибкой, устраните причину и запустите набор сценариев повторно: операции идемпотентны.

  • Если в сообщении об ошибке вместо причины выводится Unknown Error, запустите повторно импорт с параметром -e controller_configuration_secure_logging=false – коллекция скрывает детали ошибок, чтобы не раскрывать секретные значения в журнале.

  • Если запрос завершается ошибкой RemoteDisconnected или HTTP 504, запустите повторно импорт: под нагрузкой шлюз может разрывать отдельные соединения.

  • Если импорт полномочий завершается сообщением Missing 'user', 'team', or 'organization' или ссылкой на организацию ORGANIZATIONLESS, вернитесь к правке полномочий.

  • Если импорт узлов завершается ошибкой HTTP 403 с текстом License is missing, активируйте лицензию и повторите импорт.

  • Если импорт потока заданий завершается ошибкой TypeError: 'NoneType' object is not subscriptable, в файле экспорта остались узлы согласования – вернитесь к правке потоков заданий.

  • Если назначение роли завершается ошибкой You don't have permission to POST to /api/controller/v2/roles/<id>/users/, в файле user_roles.yaml остались роли уровня организации – вернитесь к правке назначений ролей.