Files
poc-frr-anycast/docs/2026-09-03-ansible-site-a-summary.md
ayurishchevandClaude Sonnet 5 98f9f502ce Add Ansible playbook for Site A FRR configuration on VMs
Разворачивает FRR на a1/a2/a3 (площадка A) через Ansible вместо
Docker-лабы, для реальных ВМ. Provisioning ВМ (3 NIC: внешний +
2 приватных) — Terraform, вне рамок этой задачи; playbook создаёт
только dummy0 (netplan) и конфигурирует FRR.

- ansible/site-a.env — единственный источник site-A-специфичных
  значений (ASN, anycast-префикс, router-id/BGP-соседи по узлам,
  имена интерфейсов); роль frr_anycast полностью параметризована
- ansible/roles/frr_anycast — задачи, handlers (netplan apply перед
  restart frr), шаблоны frr.conf.j2/daemons.j2/dummy0.netplan.yml.j2
- ansible/tests/render-check.sh — офлайн golden-diff проверка
  рендера конфигов против уже провалидированных в Docker-лабе
  frr/a{1,2,3}/ (ВМ ещё не подняты, функциональный тест недоступен)
- README.md — раздел «Развёртывание площадки A на ВМ (Ansible)»
- docs/ — план и summary изменения

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bc3HkMiDwooSyLBLoMKNyF
2026-09-03 14:14:04 +03:00

38 lines
5.0 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 playbook для настройки площадки A
**Дата:** 2026-09-03
**План:** [2026-09-03-ansible-site-a-plan.md](2026-09-03-ansible-site-a-plan.md)
## Что сделано
Создан `ansible/` — playbook + роль `frr_anycast` для конфигурации FRR на ВМ площадки A (a1/a2/a3). Provisioning ВМ (3 NIC: 1 внешний + 2 приватных) — Terraform, вне рамок этой задачи; playbook создаёт только `dummy0` (netplan) и разворачивает FRR.
**Параметризация подтверждена практически, а не только на словах**: единственный источник site-A-специфичных значений — `ansible/site-a.env` (плоский `KEY=VALUE`). Цепочка `env → group_vars/site_a.yml + host_vars/a{1,2,3}.yml (lookup('env', ...)) → роль frr_anycast → шаблоны` — ни один IP/ASN/router-id не захардкожен ни в роли, ни в `frr.conf.j2`/`daemons.j2`/`dummy0.netplan.yml.j2`.
Ansible оказался уже установлен системно (core 2.14.18) — venv по плану не потребовался (сценарий с `python3 -m venv venv` реализован в `run.sh` как fallback, но не задействован). `ansible-lint` не установлен и не устанавливался — по плану опционален.
## Отклонения/уточнения в процессе реализации
1. **`ERROR: Ansible requires blocking IO`** — известное ограничение ansible-playbook в этом sandboxed-окружении при прямом запуске из Bash-тула; решается пайпом через `cat` (`... 2>&1 | cat`). Учтено в `render-check.sh`.
2. **`group_vars`/`host_vars` не подхватились в тестовом плейбуке** — Ansible ищет их относительно каталога *переданного* playbook'а и inventory-файла; `ansible/tests/render-test.yml` лежит в подкаталоге `tests/`, поэтому `ansible/group_vars`/`ansible/host_vars` не попадали в scope автоматически. Продакшн-playbook `ansible/site-a.yml` (лежит прямо в `ansible/`) эту проблему не имеет — переменные подхватываются штатно. Для теста добавлены явные задачи `include_vars`.
3. **`daemons.j2` переписан без Jinja-цикла** — изначальный вариант с `{% for %}` рисковал дать лишние пустые строки при рендере (поведение `trim_blocks`/`lstrip_blocks`), а набор демонов не site-специфичен (одинаков на всех A-нодах) — статичный текст безопаснее и предсказуемее.
## Результаты проверки (без живых ВМ — они не подняты)
- `ansible-playbook --syntax-check` — OK.
- **`ansible/tests/render-check.sh`** — golden-diff рендера `frr.conf.j2`/`daemons.j2` для a1/a2/a3 против уже подтверждённых живыми BGP-сессиями (10/10 Established, 3-way ECMP — см. `docs/2026-09-03-anycast-lab-summary.md`) `frr/a{1,2,3}/{frr.conf,daemons}`:
- `daemons` — совпадает побайтово для всех трёх узлов.
- `frr.conf` — совпадает полностью, за вычетом блока `interface dummy0` (осознанно вынесен в netplan, см. Context плана) — единственное различие подтверждено и является дизайн-решением, а не ошибкой.
- Синтаксис Jinja-шаблона netplan (`dummy0.netplan.yml.j2`) проверен рендером с тестовыми значениями и парсингом через `yaml.safe_load` — валиден.
## Известное ограничение
Реальный apply (`apt install frr`, `netplan apply`, `systemctl restart frr`) и функциональная проверка (`show bgp summary` и т.д. на живых ВМ) не выполнялись — ВМ площадки A ещё не подняты Terraform-слоем. Это нужно сделать вручную после провижининга (команды — в README, раздел «Развёртывание площадки A на ВМ»).
## Изменённые/новые файлы
- `ansible/` — вся структура (site-a.env, run.sh, ansible.cfg, inventory/, group_vars/, host_vars/, site-a.yml, roles/frr_anycast/, tests/).
- `.gitignore` — новый (`venv/`, `*.retry`).
- `README.md` — новый раздел «Развёртывание площадки A на ВМ (Ansible)».
- `docs/2026-09-03-ansible-site-a-plan.md`, `docs/2026-09-03-ansible-site-a-summary.md`.