По updated_dia.png: новое окружение "Облачная площадка" (vr01-vr04, AS 65200, anycast 172.31.255.10/32) с двумя внешними BGP-каналами — основным (ASN 65104, без as-path prepend) и резервным (ASN 65103, с prepend на всех узлах) — плюс sNAT (nftables masquerade) на внешнем интерфейсе. Роль frr_anycast обобщена под это: вместо двух жёстко именованных соседей — список bgp_neighbors произвольной длины с флагом prepend; sNAT/ip_forward — опциональный блок (enable_snat). Площадка A мигрирована на новый формат host_vars/group_vars без изменения site-a.env и без изменения рендера — render-check.sh (golden-diff) по-прежнему проходит 6/6. Для site-cloud (окружение новое, ВМ не подняты) добавлен render-check-cloud.sh с grep-инвариантами: 4 соседа на узел, prepend только на резервном канале, nftables masquerade на внешнем интерфейсе — 56/56 проверок пройдено. run.sh обобщён на несколько окружений: инвентарь по имени playbook'а, env-файл через SITE_ENV_FILE (алиас SITE_A_ENV_FILE сохранён). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Bc3HkMiDwooSyLBLoMKNyF
42 lines
6.2 KiB
Markdown
42 lines
6.2 KiB
Markdown
# Summary: доработка Ansible под топологию updated_dia.png
|
||
|
||
**Дата:** 2026-09-09
|
||
**План:** [2026-09-09-ansible-site-cloud-plan.md](2026-09-09-ansible-site-cloud-plan.md)
|
||
|
||
## Что сделано
|
||
|
||
1. **Обобщена роль `frr_anycast`** (используется обоими окружениями):
|
||
- `templates/frr.conf.j2` переписан с двух жёстко именованных соседей (`neighbor_b1`/`neighbor_b2`) на список `bgp_neighbors` произвольной длины, каждый элемент — `{ip, asn, prepend}`. Route-map с as-path prepend рендерится условно (только если хотя бы у одного соседа `prepend: true`), количество prepend'ов — `as_path_prepend_count`.
|
||
- Добавлена опциональная (`enable_snat: true`) поддержка sNAT: `templates/nftables.conf.j2` (masquerade на внешнем интерфейсе), задачи в `tasks/main.yml` (persist `net.ipv4.ip_forward=1`, установка/конфиг/запуск `nftables`), pre-flight проверка `ext_iface`, handlers `Reload sysctl`/`Reload nftables`.
|
||
- Все новые возможности выключены по умолчанию (`defaults/main.yml`), поэтому не активны, пока окружение явно их не включит.
|
||
2. **Рефакторинг площадки A под новый формат роли** (без изменения `site-a.env` и, что важно, без изменения рендера): `group_vars/site_a.yml` (`site_a_asn` → `local_asn`), `host_vars/a{1,2,3}.yml` (переписаны на `bgp_neighbors: [...]`, оба `prepend: false`).
|
||
3. **Новое окружение `site-cloud`** (по диаграмме `updated_dia.png`, вторая/уточнённая версия): 4 узла `vr01`–`vr04`, AS 65200, anycast `172.31.255.10/32`, единый `bgp_neighbors` (2 пира ASN 65104 без prepend, 2 пира ASN 65103 с prepend) в `group_vars/site_cloud.yml` — т.к. все 4 узла сидят на общих с обоими пирами L2-сегментах, список соседей не различается по узлам (только `router_id` в `host_vars/vr0N.yml`).
|
||
4. `run.sh` обобщён: env-файл через `SITE_ENV_FILE` (алиас `SITE_A_ENV_FILE` сохранён), инвентарь определяется по имени playbook'а (`X.yml` → `inventory/X.yml`) — без этой правки `run.sh` подставлял бы `inventory/site-a.yml` даже для `site-cloud.yml`.
|
||
5. Новый `ansible/tests/render-check-cloud.sh` (+`render-test-cloud.yml`) — golden-файла для нового окружения нет, поэтому вместо byte-diff используются grep-инварианты (см. ниже).
|
||
|
||
## Как менялось понимание топологии в процессе (важно для истории)
|
||
|
||
Первая версия `updated_dia.png` читалась как «2 наши площадки по 2 узла, prepend только у узлов резервной площадки» — после того как пользователь обновил диаграмму и дал точные уточнения, выяснилось: это **одна** наша площадка («Облачная», 4 узла), у **каждого** узла по 2 канала (не 2 площадки на 2 узла), prepend — по каналу (резервному), а не по узлу, и применяется **на всех 4** узлах одновременно. План был полностью пересобран под это уточнённое прочтение до начала реализации.
|
||
|
||
## Результаты проверки (ВМ не подняты — офлайн)
|
||
|
||
- `--syntax-check` — OK для `site-a.yml` и `site-cloud.yml`.
|
||
- **Регресс площадки A**: `ansible/tests/render-check.sh` — все 6 проверок (`frr.conf`/`daemons` × a1/a2/a3) по-прежнему проходят побайтово после рефакторинга роли и host_vars.
|
||
- **`render-check-cloud.sh`**: 56/56 grep-проверок пройдено — на каждом из 4 узлов ровно 4 BGP-соседа (2×65104, 2×65103), `route-map RM-PREPEND-OUT` с `set as-path prepend 65200 65200 65200` применён **только** к двум резервным соседям, `nftables.conf` содержит `masquerade` на заданном внешнем интерфейсе.
|
||
- Вручную проверен полный рендер `frr.conf` для vr01/vr03 — идентичен по структуре, отличается только `hostname`/`router-id`.
|
||
- `nftables.conf` дополнительно провалидирован через `nft -c -f` (синтаксис корректен).
|
||
|
||
## Известное ограничение
|
||
|
||
Реальный apply и функциональная проверка на живых ВМ не выполнялись — ВМ окружения `site-cloud` не подняты (как и ранее для площадки A).
|
||
|
||
## Изменённые/новые файлы
|
||
|
||
- Роль: `ansible/roles/frr_anycast/{defaults,tasks,handlers}/main.yml`, `templates/frr.conf.j2` (переписан), `templates/nftables.conf.j2` (новый).
|
||
- Площадка A (рефакторинг, без изменения рендера): `ansible/group_vars/site_a.yml`, `ansible/host_vars/a{1,2,3}.yml`.
|
||
- Новое окружение: `ansible/site-cloud.env`, `ansible/inventory/site-cloud.yml`, `ansible/group_vars/site_cloud.yml`, `ansible/host_vars/vr0{1,2,3,4}.yml`, `ansible/site-cloud.yml`.
|
||
- `ansible/run.sh` — обобщён (SITE_ENV_FILE + auto-inventory).
|
||
- `ansible/tests/render-test-cloud.yml`, `ansible/tests/render-check-cloud.sh` — новые.
|
||
- `README.md` — новый раздел «Второе окружение: Облачная площадка», обновлена структура/раздел площадки A.
|
||
- `docs/2026-09-09-ansible-site-cloud-plan.md`, `docs/2026-09-09-ansible-site-cloud-summary.md`.
|