Коротко. Очередь — это каталог /opt/ampli/apps/marvinbase/queue/<NODE>/ с набором JSON/INI, из которого install-ng строит модель: окружение, сети, машину, колонку и сетевые привязки. Правило №1 — брать очередь с рабочего узла и править, а не писать с нуля. Почти все «тихие» отказы установки (пустая политика, column NOTINITIALIZED, нода в CONFIGURING навсегда, фантомные машины) — это поля очереди, а не продукт.
1. Зачем очередь и кто её читает
install-ng.py запускается с --config .../queue/<NODE>/config-ng.ini. config-ng.ini указывает
на каталог (model_data_path), а остальные файлы этого каталога импортируются в модель:
environment.json — окружение, network.json — сети, machine.json — машина, column.json —
колонка, configrule.json — правила конфигурации. Плюс пара сертификатов и authorized_keys.
Восемь логических единиц (пара ca_cert.crt + ca_cert.key считается одной):
| Файл | Что задаёт |
|---|---|
config-ng.ini |
путь к очереди, число узлов, ветка политики, привязка NIC→сеть |
environment.json |
deployment_id, имя окружения, домен, доп. пакеты |
network.json |
PUBLIC и PRIVATE сети, их подсети и шлюзы |
machine.json |
роль, BMC, bootmode, NIC и адреса по MAC |
column.json |
принадлежность колонке, эндпоинты S3/AXM и Model API |
location.json |
локация/стойка (как правило, переносится без правок) |
configrule.json |
правила конфигурации (SSL, брендинг и т. п.) |
ca_cert.crt, ca_cert.key, authorized_keys |
доверие и доступ |
Набор в разных сборках может отличаться на один файл: ориентир — очередь с рабочего узла той же версии, а не список из документации.
2. config-ng.ini
Минимум, который проверяется всегда:
[general]
model_data_path = /opt/ampli/apps/marvinbase/queue/<NODE>
nr_of_nodes = 0
policy_type = single-denali-8
model_data_path— абсолютный путь до каталога очереди, не относительный.nr_of_nodes = 0отключает ожидание второго узла (wait_for_remote_pxe_nodes). Ставите один узел и не ждёте второй — ставьте0; иначе установщик будет ждать партнёра.policy_type— ветка политики DSS под фактическое число блоксторов (single-denali-4/8/10/16/20/24). Стоковая ветка рассчитана на большие полки; для малого числа дисков еёw+sне влезает, подробнее — Формула политики DSS.
Отдельная секция — привязка интерфейсов к сетям модели:
[spxctrlstoragemgmt_nic_network_map]
enp3s0 = <PUBLIC_NET>
enp5s0f1 = <PRIVATE_NET>
Имя секции — <роль машины в нижнем регистре>_nic_network_map. Без этой секции mgmt-адрес на ноду
не приедет, хотя модель будет выглядеть зелёной. Если в логе есть строка
no nic mapping entry for role ... — читать её буквально: секция названа не по той роли.
3. environment.json, network.json, location.json
environment.json: новыйdeployment_id(у каждой инсталляции свой),name,domain, при необходимостиadditional_packages(например, пакет с профилем железа).network.json: PUBLIC и PRIVATE сети с подсетями. Приватная сеть обязательна — без неёinstall-ngне найдёт storage-сеть и упадёт на импорте.location.json: локация/стойка. Обычно переносится как есть; серийник локации в модели нужен, иначе GUI может показать пустую страницу «Ресурсы».
⚠️ Шлюз задаётся в модели (network.route или nic.gateway), а не руками на ноде: продукт
рендерит сетевые конфиги из модели и перезапишет ручной ip route. Пустые route/gateway —
это отсутствие default route: ноды видны в своих подсетях, из внешней сети — нет.
4. machine.json
role— одна из допустимых ролей продукта. Для 3-нодного кластера —SPXCTRLSTORAGEMGMT(см. Роли нод).ipmi— полная вендорская форма: логин, секрет,address,netmask,dhcp,gateway,macaddress. Усечённыйipmi(толькоaddress) валится на'Ipmi' object has no attribute 'id'.nic— только два реально работающих порта: mgmt и storage, адреса по MAC. Лишние порты из шасси в очередь не попадают: продукт пометит ихNOTMANAGED, это нормально.bootmode—PXEдля установки по сети. Приbootmode=DISKустановщик вообще не заходит в веткуosinstallи молча пропускает установку ОС.nictype—ether, неethernet.- имя сети в NIC — имя сети из модели (
<PUBLIC_NET>/<PRIVATE_NET>), иначеNetwork PUBLIC not found.
5. column.json
column_deployment_id=deployment_idизenvironment.json. Расхождение — колонка не привяжется.- поля
statusбыть не должно. Лишнийstatusдаётcolumn NOTINITIALIZEDи валит установку. - эндпоинты: S3/AXM —
http://<STORAGE_IP>:11000-3иhttp://<STORAGE_IP>:10000-3, Model API —https://<MGMT_IP>:8443/model/.
6. Ловушки, которые стоят прогона
- Поле
statusвcolumn.json→column NOTINITIALIZED. - Чужие MAC в
machine.json→ в модели появляются фантомные машины (PM-<mac>), и установка уходит не туда. - Лишний NIC с «своим» адресом → модель ждёт его в сети, нода навсегда остаётся в
CONFIGURING. authorized_keysиз 15 байт (заглушка) → ключ не сработает, вход на узел только паролем.nr_of_nodesне выставлен → установщик ждёт второй узел, которого нет.- Бэкапы
.orig/.bakвgroup_vars→ ansible грузит все файлы каталога, бэкап побеждает; правка «не применяется». Бэкапы выносить вне каталога продукта. - Импорт не обновляет существующую сеть: если сеть уже создана с другим диапазоном, адрес
ноды даст
IP address ... not part of referenced network. Сеть правится в модели, а не в очереди.
7. Проверка очереди до запуска (read-only)
jq . /opt/ampli/apps/marvinbase/queue/<NODE>/machine.json→ валидный JSON,roleиз списка, ровно два NIC.jq . .../column.json→column_deployment_idсовпадает сdeployment_id, поляstatusнет.grep -E 'model_data_path|nr_of_nodes|policy_type' .../config-ng.ini→ абсолютный путь,0, существующая ветка политики.wc -c .../authorized_keys→ ключ, а не заглушка в несколько байт.python3 -m json.toolпо каждому JSON → без ошибок (битый JSON = отказ импорта).- Валидатор модели (
install-ng.py -V) →model data validation successful, безincorrect value ... for role.
Только после этого — запуск. Порядок фаз и маркер завершения — install-ng: фазы и флаги.
8. Источники
- Software Documentation Center (дата доступа 2026-11-07)
- Наша практика (обезличено): подготовка очереди и прогоны install-ng на 3-нодных стендах.
- Обновлено: 2026-11-07.