Sideboard-Test fuer ap1 (TP28) plus Umsetzung des TP25-Kanalplans in einem Zug am Manager (crs326-core): L2 (TEST-ether3-trunk-ap1-sideboard-2, bridge-vlan, committed): - ether3 zum AP-Trunk fuer ap1 hinzugefuegt (analog ether15/ether21) - Template mikrotik_routeros.j2 nachgezogen: ether3 in allen VLAN-Zeilen WLAN (TP25-kanalplan-ap1-live, wifi-channel, OFFEN bis 2026-09-10): - ch-5g-ap1: 5180 -> Frequenz-Liste 5260,5280 (DFS Band B, ch52/56) - ch-5g-ap2: 5220 -> Frequenz-Liste 5300,5320 (DFS Band B, ch60/64) - Neue Provisioning-Regeln fuer ap1 (radio-mac E5=5G, E6=2G), analog ap2/ap3 - remote-cap provision fuer ap1 und ap2 Live-Ergebnis (35 Clients an der Registration-Table, vorher 30): - ap1: 5260/5280 + 2412 (ch1), 9/9 Interfaces up - ap2: 5300/5320 + 2462 (ch11), 9/9 up - ap3: 5180 + 2437 (ch6), unveraendert - Keine 5-GHz-Kollisionen mehr, 2,4-GHz sauber auf ch1/6/11 Follow-up in naechster Session: In-situ-Messungen an den Aufstellorten; bei ok Template auf Frequenz-Listen + ap1-Provisioning-Regeln erweitern und die offene Akte committen. Snapshot fuer Rollback liegt bereit. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Nautobot-Tooling
ingest-baseline.py
Idempotenter Basisdaten-Ingest (Locations, Rollen, Device-Types, Devices, VLANs/Prefixes, ap1-Interfaces + IPs, WLAN-Modelle). Bildet den Ist-Zustand ab, nicht den Zielzustand.
export NAUTOBOT_TOKEN=... # aus docs/nas-vlan20/stacks/210-nautobot.yml (gitignored)
python3 nautobot/ingest-baseline.py # Dry-Run
python3 nautobot/ingest-baseline.py --apply # schreiben
API-Fallen (teuer gelernt)
tagged_vlansliest sich per REST alsnull, obwohl korrekt gespeichert. Verifikation nur über GraphQL:POST /api/graphql/mit{interfaces(device:"ap1"){name mode untagged_vlan{vid} tagged_vlans{vid}}}.- Relationen kommen ohne
?depth=1ohnedisplay→ ein voll gepflegtes Device sieht leer aus. LocationType.content_typesmussipam.vlangroup/ipam.vlan/ipam.prefix/dcim.controllerenthalten, sonst 400 beim Anlegen.parent_interfacenur für virtuelle Interfaces — WLAN-VAPs können ihren Master nicht als Parent tragen.WirelessNetworkhat kein VLAN-Feld; die VLAN-Bindung hängt anwireless/controller-managed-device-group-wireless-network-assignmentsund braucht zwingend einenController(bei uns logisch,controller_deviceleer — kein CAPsMAN).RadioProfile.channel_widthwill Integer ([20,40,80]), nicht"20mhz".- IP↔Interface läuft über
/ipam/ip-address-to-interface/.
ingest-wifi-access-list-rule.py
Legt ComplianceFeature + ComplianceRule wifi-access-list an (Plattform RouterOS,
match_config=/interface wifi access-list). Idempotent, Dry-Run ist Standard.
export NAUTOBOT_TOKEN=...
python3 nautobot/ingest-wifi-access-list-rule.py --apply
Warum es die Rule braucht: ohne sie erzeugen Eintraege in der access-list keinen Drift
und lassen sich nicht als Config-Transaktion fuehren -- gc-transaktion.py verlangt eine
ComplianceRule als --scope. docs/tp25-pin-s22.sh schreibt dort bei jedem Messrundgang, und
TP25 Fund E (signal-range-Boden) landet dauerhaft dort.
Der Soll-Zustand ist leer und steht als Kommentarblock [6c] im Template. Waehrend eines
Messlaufs ist der Drift erwartet und gehoert als offene Transaktion gefuehrt.