Импорт в Astra Automation#
Импорт выполняется в два шага, отражающих архитектуру Astra Automation:
Платформенные ресурсы – организации, пользователи, команды – создаются через API шлюза с помощью коллекции
ansible.gateway_configuration. Шлюз автоматически синхронизирует их со всеми компонентами платформы.Ресурсы 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остались роли уровня организации – вернитесь к правке назначений ролей.