По 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
6.2 KiB
6.2 KiB
Summary: доработка Ansible под топологию updated_dia.png
Дата: 2026-09-09 План: 2026-09-09-ansible-site-cloud-plan.md
Что сделано
- Обобщена роль
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(persistnet.ipv4.ip_forward=1, установка/конфиг/запускnftables), pre-flight проверкаext_iface, handlersReload sysctl/Reload nftables. - Все новые возможности выключены по умолчанию (
defaults/main.yml), поэтому не активны, пока окружение явно их не включит.
- Рефакторинг площадки 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). - Новое окружение
site-cloud(по диаграммеupdated_dia.png, вторая/уточнённая версия): 4 узлаvr01–vr04, AS 65200, anycast172.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). 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.- Новый
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.