41 lines
6.2 KiB
Markdown
41 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`.
|