Files
poc-frr-anycast/docs/2026-09-09-ansible-site-cloud-summary.md
ayurishchevandClaude Sonnet 5 b2b7306a3c Generalize frr_anycast role, add site-cloud environment (4 nodes, prepend, sNAT)
По 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
2026-09-09 20:59:40 +03:00

42 lines
6.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`.