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

6.2 KiB
Raw Permalink Blame History

Summary: доработка Ansible под топологию updated_dia.png

Дата: 2026-09-09 План: 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.