Разворачивает 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
50 lines
1.8 KiB
Bash
Executable File
50 lines
1.8 KiB
Bash
Executable File
#!/bin/sh
|
||
# Офлайн-проверка шаблонов роли frr_anycast: рендерит frr.conf/daemons для
|
||
# a1/a2/a3 (только control node, реальные ВМ не нужны) и сравнивает с уже
|
||
# проверенными в Docker-лабе golden-файлами frr/a{1,2,3}/{frr.conf,daemons}.
|
||
set -e
|
||
cd "$(dirname "$0")/.." # -> ansible/
|
||
|
||
ENV_FILE="${SITE_A_ENV_FILE:-site-a.env}"
|
||
if [ ! -f "$ENV_FILE" ]; then
|
||
echo "Не найден файл переменных окружения: $ENV_FILE" >&2
|
||
exit 1
|
||
fi
|
||
|
||
set -a
|
||
# shellcheck disable=SC1090
|
||
. "./$ENV_FILE"
|
||
set +a
|
||
|
||
OUT_DIR="$(mktemp -d)"
|
||
trap 'rm -rf "$OUT_DIR"' EXIT
|
||
|
||
ansible-playbook -i inventory/site-a.yml tests/render-test.yml -e "render_out_dir=$OUT_DIR" 2>&1 | cat
|
||
|
||
STATUS=0
|
||
for n in a1 a2 a3; do
|
||
for f in frr.conf daemons; do
|
||
golden="../frr/$n/$f"
|
||
rendered="$OUT_DIR/$n/$f"
|
||
# frr.conf в Docker-лабе включает "interface dummy0 / ip address ...":
|
||
# там его назначает zebra. В VM-варианте тот же адрес назначается через
|
||
# netplan (dummy0.netplan.yml.j2), поэтому в frr.conf.j2 блока нет —
|
||
# это осознанное расхождение (см. Context плана), исключаем его перед diff.
|
||
if [ "$f" = "frr.conf" ]; then
|
||
golden_cmp="$OUT_DIR/.golden-$n-$f"
|
||
sed '/^interface dummy0$/,/^!$/d' "$golden" > "$golden_cmp"
|
||
else
|
||
golden_cmp="$golden"
|
||
fi
|
||
if diff -u "$golden_cmp" "$rendered" >/tmp/render-check.diff 2>&1; then
|
||
echo "OK $n/$f совпадает с $golden (за вычетом дизайн-отличия dummy0, см. выше)"
|
||
else
|
||
echo "FAIL $n/$f отличается от $golden:"
|
||
cat /tmp/render-check.diff
|
||
STATUS=1
|
||
fi
|
||
done
|
||
done
|
||
|
||
exit "$STATUS"
|