Dlaczego w ogóle automatyzować infrastrukturę sieciową?
Ręczne zmiany: SSH, copy-paste i Excel jako „system zarządzania konfiguracją”
Typowy dzień admina sieci wygląda podobnie w wielu firmach: ticket z ITSM, logowanie po SSH do routera lub firewalla, szybkie show run, edycja w notatniku, potem copy-paste do CLI. Na koniec zrzut aktualnej konfiguracji do pliku tekstowego, może dopisek w Excelu albo w opisie zgłoszenia. Brzmi znajomo?
Taki proces daje poczucie kontroli, bo „widzę, co robię na żywo”. W praktyce prowadzi jednak do zupełnie odwrotnych efektów: brak spójnej historii zmian, brak standardu, różne style konfiguracji między inżynierami, a wreszcie – zależność od pojedynczych osób, które „pamiętają, co gdzie było ruszane”. Gdy pojawia się awaria po zmianie, odtwarzanie stanu sprzed godzin czy dni bywa wręcz niemożliwe.
Jak dziś wygląda twój proces? Masz spójny sposób dokumentowania zmian konfiguracji, czy głównie logi w terminalu i notatki w głowie? To pierwsze pytanie, zanim zaczniesz myśleć o CI/CD dla sieci.
Konsekwencje ręcznych wdrożeń: nieprzewidywalność i długie okna serwisowe
Ręczne wdrożenia konfiguracji routerów, firewalli i load balancerów mają kilka stałych cech:
- Nieprzewidywalność efektu – drobna literówka w ACL, pomylona strefa bezpieczeństwa, źle ustawiony priorytet VRRP; wszystko to może zadziałać inaczej niż zakładano.
- Długie okna serwisowe – zmiany robi się po nocach, bo „jak coś pójdzie nie tak, będziemy mieć czas na cofnięcie”. To prowadzi do przemęczenia i większej liczby błędów.
- Trudne audyty – gdy audytor pyta: „pokażcie, kto zmieniał reguły firewalli w ostatnich 6 miesiącach i dlaczego”, zaczyna się polowanie na logi i stare pliki konfiguracyjne.
- Chaos między zespołami – zespół bezpieczeństwa widzi jedno, zespół sieci inne, zespół aplikacyjny jeszcze coś innego. Brakuje pojedynczego źródła prawdy.
Dodatkowo, każda zmiana bywa unikalną „operacją specjalną”, zamiast powtarzalnym procesem. Zastanów się: ile z twoich ostatnich wdrożeń było w pełni przewidywalnych i dałoby się je odtworzyć krok po kroku po pół roku?
Jakie bóle ma rozwiązać CI/CD dla sieci?
Automatyzacja infrastruktury sieciowej i podejście CI/CD nie są celem samym w sobie. Mają odpowiedzieć na konkretne bóle:
- Przerwy w działaniu po zmianach – każda zmiana na firewallu czy BGP może wywołać kaskadę skutków. CI/CD wprowadza mechanizmy wczesnego wykrywania problemów (lint, testy, symulacje).
- Chaos w konfiguracjach – ten sam typ routera skonfigurowany na trzy różne sposoby w trzech oddziałach. Automatyzacja wymusza standaryzację.
- Konflikty między zespołami – kto odpowiada za regułę, która zablokowała system? CI/CD pozwala powiązać zmianę z konkretnym commitem, ticketem i osobą.
- Brak kontroli nad politykami bezpieczeństwa – manualne reguły „na szybko” łamią standardy. Automatyzacja i walidacja polityk bezpieczeństwa ogranicza takie wyjątki.
Jeżeli twoim celem jest skrócenie okien serwisowych i zmniejszenie liczby „niespodziewanych” awarii po zmianach, CI/CD dla sieci jest właśnie środkiem do osiągnięcia tego rezultatu.
Od pojedynczych skryptów do ciągłego procesu
Wielu inżynierów sieci ma już za sobą etap pierwszej automatyzacji: skrypty ad-hoc w Pythonie, pojedyncze playbooki Ansible, może kilka szablonów Jinja2 do generowania konfiguracji. To świetny początek, ale ma jedną wadę: nadal bazuje na ręcznym wywoływaniu, często z laptopa jednego admina.
CI/CD zmienia sposób myślenia: konfiguracja nie jest już jednorazowym projektem, ale ciągłym procesem. Każda zmiana zaczyna się od modyfikacji kodu w repozytorium, przechodzi przez testy i walidacje, a dopiero na końcu trafia do produkcji. Znika „magia” laptopa admina, a pojawia się transparentny pipeline.
Co już próbowałeś u siebie? Pojedyncze playbooki? Własne skrypty bash? Pytanie, które warto sobie zadać: jak przenieść te istniejące elementy do uporządkowanego procesu CI/CD, zamiast pisać wszystko od zera.

Fundamenty: infrastruktura sieciowa jako kod (Network as Code)
Konfiguracja jako kod vs „skrypty w szufladzie”
Network infrastructure as code oznacza, że wszytko, co definiuje zachowanie twojej sieci – adresacja, polityki bezpieczeństwa, routing, VIP-y na load balancerach – jest opisane w formie czytelnych plików tekstowych, wersjonowanych w systemie Git. To więcej niż posiadanie kilku skryptów automatyzujących powtarzalne zadania.
Różnica między konfiguracją jako kod a „skryptami w szufladzie” jest zasadnicza:
- kod jest wspólnym zasobem zespołu, nie prywatnym zbiorem plików na dysku jednego admina,
- zmiany są przeglądane (code review), testowane i zatwierdzane,
- każda wersja konfiguracji ma historię – kto i kiedy ją zmienił oraz dlaczego,
- do kodu można dołączyć testy i walidacje, a nie tylko „nadzieję, że zadziała”.
Jeżeli twoje aktualne skrypty i konfiguracje nie są w Git, pierwszym krokiem w stronę CI/CD jest właśnie ich uporządkowanie i zcentralizowanie.
Struktura repozytorium dla sieci: urządzenia, role, lokalizacje, środowiska
Dobrze zaprojektowane repozytorium to połowa sukcesu. Chaos w strukturze plików niemal gwarantuje konflikty między inżynierami i problemy przy wdrożeniach. Zacznij od prostego pytania: jaki masz model sieci – bardziej „lokacyjny” (oddziały, regiony), czy „funkcyjny” (DC, WAN, security, access)?
Przykładowa struktura repo dla automatyzacji sieci (Ansible + szablony) może wyglądać tak:
inventory/lab/test/prod/
group_vars/(np.dc.yml,branch.yml,firewalls.yml)host_vars/(indywidualne parametry konkretnych urządzeń)roles/router_core/router_branch/firewall_edge/loadbalancer_app/
templates/(Jinja2 – szablony konfiguracji)playbooks/(definicje zadań Ansible)
Rozdzielenie na środowiska (lab/test/prod) jest kluczowe. W CI/CD dla sieci zmiana powinna przejść przez te same playbooki i szablony, ale z różnym inventory. Jeśli dziś nie masz osobnego labu, zacznij chociaż od wydzielonego „wirtualnego” środowiska na symulatorach lub urządzeniach testowych.
Formaty i konwencje: YAML, Jinja2 oraz separacja danych od logiki
W praktyce większość wdrożeń network as code opiera się na trzech elementach:
- YAML – format danych opisujący parametry urządzeń, polityki, adresy, listy obiektów,
- Jinja2 – szablony generujące finalną konfigurację na podstawie danych,
- playbooki (np. Ansible, Nornir) – opisujące kroki wdrożenia i walidacji.
Kluczem jest rozdzielenie logiki od danych. Adresacja VLAN-ów, nazwy interfejsów, listy obiektów firewall powinny być w plikach YAML. Z kolei definicja, jak te dane składają się w finalny config, powinna znajdować się w szablonach. Unikaj umieszczania konkretnej adresacji bezpośrednio w szablonach – to prosta droga do duplikacji i trudnych zmian.
Sprawdź u siebie: gdzie dziś przechowujesz wiedzę o adresacji, strefach, obiektach? W głowie, w Excelu, w Wiki? Każdy z tych miejsc można systematycznie przenosić do YAML, zyskując centralne, wersjonowane źródło prawdy.
Modelowanie routerów, firewalli i load balancerów w jednym podejściu
Jedno repozytorium ma obsłużyć trzy różne typy urządzeń: routery, firewalle i load balancery. Na pierwszy rzut oka ich konfiguracje są zupełnie różne, ale na poziomie modelu można znaleźć wspólne elementy:
- routery – interfejsy, adresacja, protokoły routingu (OSPF, BGP, static),
- firewalle – strefy, obiekty, reguły, NAT, profile bezpieczeństwa,
- load balancery – VIP-y, pool-e, health checki, profile protokołów.
W YAML można to reprezentować w podobnej strukturze: listy obiektów z jasno opisanymi polami. Różnice vendorowe przenosimy do szablonów Jinja2 lub ról/specyficznych modułów Ansible. To podejście zmniejsza liczbę miejsc, w których trzeba dokonywać zmian przy nowych projektach.
Zastanów się, czy chcesz od razu modelować całą konfigurację, czy zacząć od wybranego zakresu. Często dobrym startem jest:
- reguły firewall (policy) i obiekty adresowe,
- VIP-y na load balancerach (nowe aplikacje),
- routing statyczny i podstawowe ACL na routerach dostępowych.
Mały, dobrze opanowany wycinek konfiguracji jest lepszy niż ambitna próba objęcia wszystkiego naraz, która kończy się w szufladzie.
Narzędzia i klocki: z czego zbudować pipeline sieciowy
Kluczowe kategorie: Git, automatyzacja sieci, platforma CI/CD
Pipeline CI/CD dla routerów, firewalli i load balancerów składa się z kilku obowiązkowych bloków:
- System kontroli wersji – najczęściej Git (GitLab, GitHub, Bitbucket, lokalny Gitea). To tam trzymasz szablony, inventory, playbooki i testy.
- Narzędzia automatyzacji sieci – Ansible, Nornir, Terraform (np. z providerami vendorowymi), a także narzędzia specyficzne dla producentów (Cisco NSO, Juniper Apstra, F5 AS3/DO, Palo Alto PAN-OS API).
- Platformy CI/CD – GitLab CI, GitHub Actions, Jenkins, Azure DevOps. One orkiestrują kolejne kroki pipeline’u.
Nie potrzeba setek narzędzi. Kluczowe pytanie brzmi: jakie masz już systemy w organizacji? Czy zespół DevOps używa GitLaba, a bezpieczeństwo żyje w innym świecie? Lepszy efekt osiągniesz, budując pipeline sieciowy na już znanej platformie CI, zamiast wprowadzać kolejną.
Agentless vs agent-based: jak dotrzeć do urządzeń
Urządzenia sieciowe rzadko pozwalają na instalację agentów, więc automatyzacja zwykle jest agentless – łączy się przez:
- SSH (CLI),
- NETCONF, RESTCONF,
- API REST (np. F5, Palo Alto, Fortinet, NSX).
Dlatego pipeline nie odpala żadnego agenta na routerze; zamiast tego korzysta z centralnej maszyny (runnera), która z odpowiedniej strefy sieci ma dostęp do urządzeń. To wpływa na topologię: potrzebujesz wydzielonych runnerów w segmentach, z których widać odpowiednie urządzenia.
Rozważ dwa pytania: czy twoje urządzenia obsługują już nowoczesne API, czy nadal polegasz na CLI? I drugie: czy bezpieczeństwo zgodzi się na otwarcie dostępu z runnera CI do urządzeń produkcyjnych, czy potrzebny będzie pośredni bastion?
Integracja z ITSM: kto zatwierdza zmiany i jak je śledzić
Sam pipeline techniczny to za mało. Sieć jest zwykle objęta formalnym procesem zmian (ITIL/ITSM). CI/CD dla sieci powinno integrować się z:
- ticketami (ServiceNow, Jira, inny ITSM),
- procesem zatwierdzania zmian przez CAB lub uprawnione osoby,
- rejestrem incydentów i problemów.
Typowy wzorzec: każdy merge request w repozytorium musi być powiązany z numerem zgłoszenia. Status zgłoszenia może być aktualizowany automatycznie na podstawie statusu pipeline’u (np. testy zielone – zmiana gotowa do wdrożenia, deployment zakończony – zgłoszenie zamknięte).
Zastanów się, jak dziś wygląda obieg zgłoszeń sieciowych u ciebie. Czy możesz wymusić podawanie numeru zgłoszenia w nazwie gałęzi lub commitu? To prosta metoda na późniejsze powiązanie konfiguracji z decyzjami biznesowymi.
Budowa runnerów i „fabryki configów”: gdzie faktycznie działa pipeline
Pipeline sieciowy żyje na runnerach – maszynach, które wykonują playbooki, generują konfiguracje i łączą się z urządzeniami. Jeżeli dziś uruchamiasz Ansible z własnego laptopa, zadaj sobie pytanie: co się stanie, gdy jutro będziesz na urlopie, a trzeba będzie wycofać zmianę?
Typowy układ w większych organizacjach to:
- runner CI „bezpieczny” – tylko generuje configi, uruchamia testy syntaktyczne i symulacje, nie ma dostępu do sieci produkcyjnej,
- runner „deploy” – ma dostęp SSH/API do routerów, firewalli i load balancerów (często w osobnej strefie sieci, czasem za bastionem),
- runner „lab” – widzi wyłącznie segmenty laboratoryjne, w których można ćwiczyć nowe role i szablony.
Dla części zespołów wystarczy pojedynczy runner z podziałem na stages w pipeline’ach, ale im ostrzejsze wymagania bezpieczeństwa, tym większe rozdzielenie ról. Jak jest u ciebie – CI/CD i produkcja w jednej sieci, czy świat podzielony na strefy?
Dobrym wzorcem jest trzymanie „fabryki configów” jako osobnego kroku: pipeline generuje .cfg czy .json z konfiguracją, zapisuje je jako artefakty, a dopiero kolejne zadanie (często z manualnym „approve”) robi właściwe wdrożenie. Dzięki temu w razie problemu możesz:
- pobrać dokładnie ten plik, który został wysłany na firewall,
- porównać go z nową wersją, zanim odpalisz rollback,
- zarchiwizować konfigurację razem z numerem zgłoszenia i commitem.
Testy offline: lint, walidacja danych, generowanie suchych konfiguracji
Zanim pipeline dotknie produkcyjnych urządzeń, powinien umieć powiedzieć szybkie „nie” już na etapie push/merge. Co chcesz wyłapać jak najwcześniej? Literówki, duplikaty obiektów, sprzeczne reguły, brak adresów w grupach. To wszystko można sprawdzić offline.
Przydatne kategorie testów offline:
- lint dla YAML i Jinja2 –
yamllint,ansible-lint, sprawdzenie spójności nazewnictwa, - własne walidatory w Pythonie – np. czy nie dodano dwóch VIP-ów na ten sam adres i port, czy w firewallu nie pojawiła się reguła „any-any” bez akceptacji,
- „sucha” generacja configów – pipeline generuje kompletną konfigurację dla zmienionych urządzeń, ale nigdzie jej jeszcze nie wysyła,
- porównanie z poprzednią wersją – diff konfiguracji z repo (lub „złotym” snapshotem), aby pokazać recenzentowi tylko rzeczywiste zmiany.
Dla części zespołów realnym przełomem jest prosty krok: każde merge request musi przejść generację configu i diff. Nagle dyskusja na code review nie brzmi „co ten playbook robi?”, tylko „czy akceptujesz, że ta reguła firewall otwiera port 8443 z całego internetu?”.
Zastanów się, które błędy powtarzają się u ciebie najczęściej: literówki w obiektach, brak komentarzy, zła strefa? To są pierwsze kandydaty na automatyczny test offline, który odrzuci zmianę, zanim dotknie jakiegokolwiek routera.
Testy w labie i symulacje: jak wprowadzić „prawie produkcję”
Następny poziom to testy, które wymagają uruchomienia playbooków w kontrolowanym środowisku. Czasami będzie to prawdziwy lab, czasem symulator (EVE-NG, GNS3, CML), a dla firewalli czy load balancerów – osobne wirtualne instancje.
Przykład prostego scenariusza:
- Pipeline generuje konfigurację dla routera brzegowego.
- Ten sam szablon i te same dane, ale z innym inventory, są użyte do routera w labie.
- Ansible wgrywa konfigurację na labowy sprzęt lub VM.
- Seria testów „po” (pingi, trasy, sprawdzenie tabel BGP) potwierdza, że nic się nie rozjechało.
Dla firewalli testy mogą wyglądać inaczej: pipeline po wdrożeniu w labie odpala serię zapytań testowych (np. skrypty curl, testy integracyjne aplikacji) i sprawdza, czy ruch jest dozwolony/zablokowany zgodnie z oczekiwaniami. Podobnie dla load balancerów – testy health checków, równoważenia i sesji sticky.
Zadaj sobie pytanie: czy jesteś w stanie odtworzyć choćby część produkcyjnego ruchu w labie? Jeśli nie, zacznij od czegoś skromniejszego: testów typu „czy nowa reguła w ogóle pozwala na połączenie z serwera A do B na porcie X”. To niewiele, ale w pipeline’ie będzie to automatyczny bufor bezpieczeństwa.
Polityki bezpieczeństwa w pipeline: kto może wdrożyć co i gdzie
Sieć to nie tylko technika, lecz także uprawnienia. Kto może dotykać firewalli brzegowych, a kto tylko routerów w oddziałach? Pipeline musi to respektować. W przeciwnym razie ITSM i bezpieczeństwo zatrzymają cały projekt.
Dobrym podejściem jest powiązanie:
- grup w systemie CI (np. GitLab groups, Azure DevOps security groups) z typami urządzeń,
- ścieżek w repozytorium – np. zmiana czegokolwiek w
roles/firewall_edgewymaga dodatkowej recenzji, - ról w ITSM – numer zgłoszenia decyduje, kto musi kliknąć „approve” przed stage deploy-prod.
W praktyce można to wdrożyć na kilka sposobów:
- branch protection: do merge’u do
mainw częścifirewall/wymagany jest review od kogoś z zespołu bezpieczeństwa, - w CI – stage deploy-prod-firewall jest zawsze manual i dostępny tylko dla konkretnej grupy,
- w ITSM – pipeline nie przejdzie do deploy, jeśli status zgłoszenia nie jest w stanie „Approved”.
Jak dziś kontrolujesz, kto zmienia reguły na firewallu? Jeżeli nadal działa to na zasadzie „kto ma dostęp do SSH, ten zmienia”, warto usiąść z zespołem bezpieczeństwa i wspólnie ustalić mapę ról w pipeline’ie.

Projekt repozytorium i strategia gałęzi: jak ogarnąć chaos wersji
Monorepo vs multirepo: jedna prawda czy wiele wysp?
Pierwsza decyzja architektoniczna: czy routery, firewalle i load balancery lądują w jednym repozytorium, czy w osobnych? Każdy wariant ma plusy i minusy.
Monorepo (jedno duże repo, wszystko razem) sprzyja:
- wspólnym standardom i rolom – np. jeden szablon namingowy interfejsów,
- łatwiejszemu refactoringowi – jedna zmiana w roli może poprawić kilkadziesiąt urządzeń,
- wspólnej „złotej prawdzie” o sieci – wszystkie YAML-e w jednym miejscu.
Multirepo (oddzielne repo dla firewalli, routerów, LB):
- pozwala na inne cykle życia – np. LB zmieniają się częściej niż core routing,
- ułatwia podział odpowiedzialności między zespoły (security vs network vs app),
- zmniejsza ryzyko konfliktów przy dużej liczbie commitów.
Jeżeli dopiero zaczynasz, zwykle łatwiej jest zacząć od jednego repo z przejrzystą strukturą katalogów. Potem, gdy rola CI/CD dla sieci się rozrośnie, możesz wydzielić bardziej autonomiczne części. Jaki masz cel: centralny obraz sieci czy maksymalne rozdzielenie odpowiedzialności?
Strategia gałęzi: trunk-based, GitFlow, a może „release-y konfiguracji”?
W projektach sieciowych rzadko sprawdza się klasyczny GitFlow z długimi żyjącymi gałęziami. Zmiany w konfiguracji są bardziej „eventowe” – konkretne wdrożenia, okna serwisowe, projekty dla klientów. Strategia gałęzi powinna tego nie utrudniać.
Trzy najczęstsze podejścia:
- trunk-based – jedna główna gałąź (
main), wszystkie zmiany w krótkich feature branches, szybkie merge’e po review i testach. Stabilność gwarantują testy CI i polityka „no direct push”. - lightweight GitFlow –
mainjako „stan produkcyjny”,developjako „kolejna fala zmian”, plus krótkie branche feature/hotfix tworzone z odpowiedniej gałęzi. - release branches – każda większa fala zmian konfiguracji (np. projekt nowego DC) ma swoją gałąź release, która potem jest tagowana i wdrażana partiami.
Dla wielu zespołów sieciowych dobrym kompromisem jest trunk-based z dodatkowymi tagami:
- tag typu
net-prod-YYYYMMDD-HHMMoznacza dokładny stan konfiguracji wdrożony w konkretnym oknie, - rollback to po prostu powrót do poprzedniego taga i odpalenie pipeline’u z tym stanem repo.
Zastanów się, jak często robisz zmiany: codziennie wiele małych, czy raz na miesiąc duże okno? Przy częstych zmianach trunk-based z krótkimi branchami będzie prostszy. Przy rzadkich, złożonych projektach release branches pomagają lepiej kontrolować zakres.
Branch per ticket, per urządzenie czy per projekt?
Drugi wymiar to to, jak mapować gałęzie na pracę zespołu. Opcji jest kilka:
- branch per ticket – każda prośba o zmianę z ITSM ma swoją gałąź, która zawiera wszystkie zmiany YAML/templating dla tej prośby,
- branch per urządzenie – rzadziej stosowane, ale czasem spotykane w małych środowiskach: zmiany dla jednego routera czy firewalla zawsze lądują w tej samej gałęzi,
- branch per projekt – np. migracja całej grupy oddziałów, nowe DC, nowy perimeter firewall.
Branch per ticket ma tę zaletę, że łatwo powiązać commit, konfigurację i decyzję biznesową. Minusem jest większa liczba gałęzi. Branch per projekt daje czytelność na poziomie „co należy do czego”, ale zmiany z różnych zgłoszeń mogą się zlewać.
Dobrą praktyką jest narzucenie konwencji nazewniczej:
feat/NRS-1234-firewall-vpn-siteX– nowe reguły VPN z ticketu NRS-1234,fix/INC-5678-bgp-flap-dc1– poprawka routingu z incydentu INC-5678.
Jaki masz dziś główny ból: śledzenie „kto co zmienił”, czy raczej konflikt wielu osób pracujących na tym samym obszarze? Odpowiedź podpowie, czy iść bardziej w branch per ticket, czy per projekt/obszar sieci.
Code review dla konfiguracji sieci: co faktycznie przeglądać?
Code review w sieci często zamienia się w „przewijanie ściany CLI”. Żeby miało sens, trzeba je ograniczyć do tego, co jest istotne z punktu widzenia funkcji i bezpieczeństwa.
Przydatne zasady:
- recenzujemy YAML i szablony, nie wygenerowane 3000 linii CLI (te mają być zrozumiałym artefaktem, ale nie miejscem ręcznych zmian),
- pipeline powinien dołączać diff konfiguracji jako artefakt lub komentarz w merge requeście – recenzent widzi wtedy tylko to, co zmienia się na urządzeniu,
- recenzentem zmian firewallowych jest ktoś z perspektywą bezpieczeństwa, zmian routingu – ktoś, kto rozumie topologię i protokoły dynamiczne.
Dobrą praktyką jest zdefiniowanie checklisty review dla każdego typu urządzeń. Dla firewalli może to być np.:
- czy nowe reguły są maksymalnie zawężone (źródła, desty, porty),
- czy jest opis biznesowy (np. numer aplikacji, właściciel),
- czy istnieją reguły zamykające „tymczasowe otwarcia”,
- czy zmiany nie dublują istniejących reguł.
Zadaj zespołowi proste pytanie: ile czasu spędzacie na review, a ile wartości z tego wynika? Jeżeli większość uwag dotyczy literówek, część pracy trzeba przenieść do automatycznych walidatorów w CI, a review zostawić dla decyzji architektonicznych.

Pipeline CI dla sieci: walidacja, testy, „szybkie nie”
Minimalny pipeline CI dla routera, firewalla i load balancera
Pipeline CI nie musi być od razu rozbudowany. Nawet kilka prostych kroków potrafi radykalnie poprawić jakość zmian. Przykładowy minimalny zestaw:
- Lint konfiguracji –
yamllint,ansible-lint, sprawdzenie składni szablonów. - Walidacja danych domenowych – własne skrypty sprawdzające adresację, reguły, obiekty.
- Generacja konfiguracji – wygenerowanie finalnych plików dla urządzeń, których dotyczy zmiana.
- Diff konfiguracji – porównanie z poprzednią wersją, zapisanie raportu jako artefaktu.
Rozszerzony CI: testy logiki sieciowej i symulacje
Minimalny pipeline zatrzymuje błędy składni i oczywiste wpadki. Kolejny krok to sprawdzenie, czy nowa konfiguracja zachowuje się tak, jak zakładasz. Tu przydają się testy logiki sieciowej i symulacje.
Zanim zaczniesz rozbudowywać CI, zadaj sobie pytanie: co najczęściej „psuje się” po wdrożeniu zmian? Routing? NAT? Balansowanie ruchu? Od tego obszaru zacznij automatyzację testów.
- Testy topologii i reachability – narzędzia typu Batfish albo własne skrypty analizujące wygenerowaną konfigurację potrafią odpowiedzieć, czy po zmianie host X nadal dosięgnie hosta Y, czy nie pojawiła się nowa ścieżka „bocznymi drzwiami”.
- Testy polityk bezpieczeństwa – dla firewalli: zestaw z góry zdefiniowanych scenariuszy (np. „aplikacja CRM może do DB na porcie 5432, ale nie do SSH”), sprawdzany na wygenerowanej konfiguracji.
- Testy reguł LB – czy wszystkie serwisy mają health checki, czy nowe pool-e nie są „sierotami” (pool bez VIP-a lub odwrotnie), czy HTTP→HTTPS redirect jest poprawny.
Praktyczny wariant: utrzymuj katalog tests/ z plikami opisującymi scenariusze sieciowe. Pipeline po wygenerowaniu konfiguracji odpala silnik testów (Batfish, własne skrypty, curl przez lab VPN) i daje prosty komunikat: „scenariusz 03-crm-db-access – FAILED”. Nie musisz mieć od razu 100 testów – zacznij od tych incydentów, które powtarzają się najczęściej.
Zastanów się: jakie dwa–trzy incydenty z ostatniego roku najchętniej „zabiłbyś” automatycznym testem? To są pierwsze kandydaty do przeniesienia do CI.
Segmentacja pipeline’u CI według typu urządzeń
Router, firewall i load balancer mają różne „punkty bólu”. Trzymanie dla wszystkich identycznego pipeline’u skończy się albo nadmierną komplikacją, albo ignorowaniem części wyników. Lepiej podejść do tego modułowo.
Dobrym wzorcem jest wspólny „szkielet” CI plus dedykowane joby per typ urządzeń:
- wspólny blok: lint, walidacja adresacji, generacja konfiguracji,
- dla routerów – walidacja BGP/OSPF/ISIS (np. czy wszystkie wymagane sąsiedztwa są opisane, czy nie generujesz duplikatu ASN, czy nie wycinasz ważnych prefix-list),
- dla firewalli – testy polityk, kontrola overlapping rules, analiza potencjalnego shadowingu reguł,
- dla load balancerów – spójność certyfikatów, poprawność health checków, powiązanie VIP–pool–member.
Jak to zaadresować technicznie? Możesz wprowadzić meta-dane na poziomie plików YAML:
device_type: firewall
vendor: paloalto
location: dc1
tests:
- policy_reachability
- no_any_any_prod
Pipeline na tej podstawie zadecyduje, które joby uruchomić. Zmiany w firewall/ nie mają sensu odpalać testów routingowych, ale już polityki bezpieczeństwa – jak najbardziej.
Jak dziś dzielisz odpowiedzialności między zespoły? Jeżeli masz oddzielny zespół od LB, daj im „własne” joby w CI i pozwól samodzielnie rozwijać ich logikę, bez dotykania reszty pipeline’u.
„Szybkie nie”: jak zatrzymać złą zmianę w minutę
Kluczowa cecha dobrego CI: nie tylko znajduje błędy, ale robi to szybko. Im szybciej dostajesz „nie”, tym mniej czasu marnujesz na czekanie na długie joby. W projektach sieciowych bywa to szczególnie bolesne, jeśli masz np. duże laby wirtualne.
Ułóż pipeline warstwowo:
- Fast-fail (kilkadziesiąt sekund) – lint, podstawowa walidacja YAML, proste reguły (np. brak adresu z „blacklisty prywatnej” w strefie DMZ), walidacja schematu.
- Logika sieciowa (kilka minut) – testy reachability, reguł firewall, bety load balancera.
- Symulacje/lab (najdłuższe) – uruchomienie topologii w GNS3/EVE-NG/vrnetlab i odpalanie testów end-to-end.
Większość prostych błędów wyłapiesz w warstwie pierwszej. Wymagające analiz lub emulacji zostaw na później. Dla merge requestów z drobnymi zmianami w mało krytycznych obszarach możesz nawet warstwę trzecią oznaczyć jako opcjonalną (np. uruchamianą tylko przed wdrożeniem na produkcję).
Zapytaj zespół: ile czasu akceptujecie na pierwszą informację zwrotną z CI? 30 sekund, 5 minut, 15 minut? To pomoże dobrać, które testy lądują w warstwie „fast-fail”, a które w „cięższej artylerii”.
Artefakty CI: co zapisywać oprócz logów
Dobrze zbudowany pipeline CI generuje nie tylko logi, ale również artefakty, które potem przydają się w CD, audycie i podczas incydentów. Chodzi o konkretne pliki, do których za kilka miesięcy ktoś będzie mógł wrócić.
Typowe, użyteczne artefakty:
- wygenerowana konfiguracja dla każdego urządzenia (np.
output/<hostname>.cfg), - raport diff – różnice między wersją przed i po, w formacie przyjaznym do czytania,
- raport testów – co przeszło, co nie, najlepiej w formie HTML lub JUnit, żeby można było kliknąć w CI,
- manifest wdrożenia – lista urządzeń, które będą dotknięte w tej zmianie, wraz z tagiem/commit ID.
Ten ostatni bywa niedoceniany. Manifest możesz potem dołączyć do zgłoszenia w ITSM, dokumentacji okna serwisowego czy analizy post‑mortem. W pipeline CD manifest jest punktem odniesienia: dokładnie wiadomo, gdzie pójść z konfiguracją.
Pomyśl: co robisz, gdy ktoś pyta po trzech miesiącach „jak dokładnie wyglądała konfiguracja przed tą zmianą?” Jeżeli dziś szukasz tego na backupach lub w history na urządzeniu, pipeline CI może przejąć tę rolę, trzymając artefakty pod konkretnym tagiem.
Integracja CI z systemami zewnętrznymi
Infrastruktura sieciowa rzadko żyje w próżni. Informacje o klientach, VLAN-ach, podsieciach, certyfikatach – to zwykle siedzi w oddzielnych systemach. Pipeline CI może je odpytać, zamiast kazać inżynierowi pamiętać wszystkie zasady.
Kilka częstych integracji:
- CMDB/IPAM – sprawdzanie, czy używany adres IP/VLAN jest zarejestrowany i dostępny, czy nie dublujesz podsieci, czy opis obiektu jest spójny z tym, co w systemie,
- PKI – dla load balancerów: weryfikacja, czy wskazane certyfikaty istnieją, nie wygasają jutro i czy CN/SAN pasuje do VIP-a,
- DNS – sprawdzanie istnienia rekordów, zakaz wprowadzania „twardych” IP tam, gdzie polityka wymaga używania nazw.
Przykład z praktyki: zespół przed każdym dodaniem nowego klienta do VPN SDS musiał ręcznie sprawdzać, czy podsieć klienta nie nachodzi na inną. Kilkadziesiąt linii Pythona podpiętych do IPAM-u zredukowało im liczbę incydentów o konflikty adresacji praktycznie do zera.
Jakie systemy są dziś „źródłem prawdy” w twojej organizacji? Które z nich możesz sensownie odpytać z pipeline’u (REST, baza, CLI)? Od tego zacznij projekt integracji.
Pipeline CD: od generowania konfiguracji do bezpiecznego wdrożenia
Model wdrożeń: push, pull czy mieszany?
CD dla sieci można ułożyć na kilka sposobów. Wybór modelu zależy od tego, jaką masz kontrolę nad urządzeniami, siecią out-of-band i polityką bezpieczeństwa.
Trzy główne modele:
- push – system automatyzacji (np. Ansible, Salt, Nornir) łączy się do urządzeń i wpycha konfigurację,
- pull – urządzenia same pobierają konfigurację z centralnego serwera (np. poprzez API, gRPC, NETCONF, GitOps dla niektórych platform),
- mieszany – część urządzeń w modelu push (np. DC), część w pull (np. oddziały za NAT, SD-WAN).
Model push jest prostszy do ogarnięcia „na start”, ale wymaga stabilnej łączności i odpowiednich uprawnień z centralnego punktu. Pull bywa bezpieczniejszy z perspektywy segmentacji (urządzenie inicjuje połączenie), ale częściej wymaga wsparcia po stronie producenta.
Zanim wybierzesz model, odpowiedz sobie: z jakich sieci chcesz wykonywać deploy? Czy masz infrastrukturę out-of-band? Jak bardzo chcesz ograniczać dostęp „z centrum” do produkcyjnych urządzeń?
Etapy CD: od dry-run do pełnego commit
Niezależnie od modelu dostarczania konfiguracji, pipeline CD dobrze jest rozbić na etapy, które stopniowo zwiększają ryzyko. Typowy zestaw:
- Pre‑deploy checks – porównanie manifestu z realnym stanem (czy urządzenie jest w inventory, czy jest osiągalne, czy wersja OS jest wspierana przez szablony).
- Dry‑run – w miarę możliwości skorzystanie z mechanizmów „preview” (np.
commit dry-run,check,validate) albo symulacji w labie. - Staged deploy – wdrożenie na wybranej grupie urządzeń (np. 1 firewall z klastra, jeden router z kilku w ring-u, jedno VIP w LB), monitoring, pauza.
- Full deploy – rollout na całą grupę według ustalonych reguł.
- Post‑checks – automatyczne sprawdzenie podstawowych metryk i testów funkcjonalnych po wdrożeniu.
Dobrze, jeśli każdy z tych etapów może być zatrzymany manualnie. Nawet w pełni zautomatyzowanym środowisku przy dużym, ryzykownym wdrożeniu ktoś może chcieć „zasłonić czerwony przycisk”.
Zastanów się: na ilu etapach chcesz mieć „manual approve”? Tylko przed produkcją, czy także przed rozpoczęciem full deploy na całą grupę urządzeń?
Strategie wdrożeń dla routerów, firewalli i LB
Nie każde urządzenie wdraża się tak samo. Topologia, sposób redundancji i charakter ruchu mocno wpływają na strategię CD.
Dla routerów (szczególnie w core i agregacji) typowe są:
- pair‑wise rolling – jeżeli masz pary routerów w HA, najpierw zmieniasz standby, weryfikujesz, potem robisz failover i zmieniasz drugi,
- per‑ring/per‑area – w sieciach MPLS/BGP/ISIS: rollout per „obręcz” lub area, monitorując stabilność protokołów dynamicznych.
Dla firewalli kluczowa jest ciągłość sesji oraz przewidywalność polityk:
- active/standby – najpierw zmiana na standby, walidacja polityk, ewentualnie ruch testowy, później przełączenie roli i zmiana na drugim,
- klastry active/active – wdrożenie partiami, czasem z tymczasowym „zamrożeniem” nowych sesji na zmienianym węźle.
Dla load balancerów najprostszą metodą jest ruch kontrolowany przez WAF/DNS:
- canary per VIP – najpierw zmiana jednej VIP, przekierowanie części ruchu (np. przez konfigurację DNS lub WAF), obserwacja metryk,
- per‑pool rollout – wprowadzenie nowego pool-a, przeniesienie do niego części backendów, obserwacja, dopiero później przenoszenie całości.
Spójrz na swoją topologię: gdzie masz naturalne „granice” do bezpiecznego rollout-u? HA pary, ringi, grupy klientów, regiony? To one powinny być jednostkami wdrożeniowymi w pipeline CD.
Kontrola okien serwisowych w CD
Sieć często rządzi się oknami serwisowymi. Nawet jeśli zmiana jest w pełni zautomatyzowana, nie możesz jej puścić w środku dnia, gdy pracuje na niej cała firma. Pipeline musi szanować te zasady.
Podejść jest kilka:
- manual trigger – stage deploy-prod jest zawsze manual i odpalany tylko w oknie serwisowym przez dyżurnego,
- okna w CI – joby produkcyjne mają ograniczenia czasowe (cron/allowed schedules); jeżeli ktoś spróbuje deploy poza oknem, job failuje z komunikatem „poza oknem”,
- integracja z kalendarzem zmian – pipeline sprawdza, czy dla danego ticketu w ITSM jest otwarte zaakceptowane okno; jeżeli nie, blokuje deploy.
Typowy kompromis: pipeline przygotowuje wszystko (konfigurację, testy, artefakty) wcześniej, a w oknie serwisowym operator jedynie odpala ostatni stage, który już niczego nie generuje, tylko wgrywa i aktywuje to, co zostało przygotowane.
Najczęściej zadawane pytania (FAQ)
Od czego zacząć z CI/CD dla sieci, jeśli dziś robię wszystko ręcznie przez SSH?
Na początek nie potrzebujesz pełnego pipeline’u CI/CD. Pierwszy krok to wyniesienie konfiguracji i skryptów z „laptopa admina” do wspólnego repozytorium Git. Zrób prosty podział: katalog na szablony konfiguracji, katalog na dane (adresacja, obiekty, reguły), katalog na playbooki lub skrypty. Zastanów się: co już masz – skrypty Python, Ansible, może jakieś pliki z configami?
Drugi krok to uporządkowanie procesu zmiany: każda modyfikacja konfiguracji przechodzi przez commit, code review i merge request. Nawet jeśli na początku nadal uruchamiasz playbooki ręcznie, zyskujesz historię zmian i jeden sposób pracy dla całego zespołu. Dopiero na tej bazie dokładane są narzędzia CI (np. GitLab CI, GitHub Actions, Jenkins), które automatycznie uruchamiają testy i generowanie konfiguracji przy każdym commicie.
Jak wygląda typowy pipeline CI/CD dla routerów, firewalli i load balancerów?
Typowy pipeline ma kilka powtarzalnych etapów. Najpierw następuje walidacja syntaktyczna (lint) plików YAML i szablonów oraz sprawdzenie zgodności z podstawowymi regułami bezpieczeństwa. Potem generowana jest docelowa konfiguracja na bazie Jinja2 i danych z inventory, a wynik jest porównywany z aktualnym stanem (diff). W tym momencie już widzisz, co dokładnie zostanie zmienione.
Kolejny krok to testy na środowisku lab/test: symulatorze, urządzeniu testowym albo wydzielonym segmencie sieci. Jeśli testy przejdą pomyślnie, pipeline może automatycznie lub półautomatycznie (z ręcznym zatwierdzeniem) wdrożyć zmianę na produkcję. Zastanów się: czy twój proces ma dziś choćby namiastkę takiej „próby generalnej” przed dotknięciem produkcji?
Jak zaprojektować repozytorium Git pod automatyzację routerów, firewalli i load balancerów?
Najpierw odpowiedz sobie na pytanie: bardziej myślisz o sieci w kategoriach lokalizacji (oddziały, regiony), czy funkcji (DC, WAN, security, access)? Od tego zależy główny podział katalogów. Sprawdzony wzorzec to: inventory podzielone na środowiska (lab/test/prod), group_vars i host_vars dla parametrów urządzeń oraz roles z logicznymi rolami (router_core, firewall_edge, loadbalancer_app).
Kluczem jest separacja danych od logiki. Adresacja, VLAN-y, strefy bezpieczeństwa czy listy obiektów trzymasz w YAML, a sposób ich „złożenia” w finalny config – w szablonach Jinja2. Dzięki temu ta sama logika może obsłużyć różne lokalizacje i środowiska, a zmiana np. adresacji w jednym oddziale nie wymaga dotykania szablonów. Zapytaj siebie: czy dziś da się zmienić konfigurację całego oddziału jednym commitem w danych?
Czy CI/CD dla sieci da się wdrożyć bez dedykowanego labu?
Można wystartować bez pełnoprawnego labu, ale potrzebujesz choć minimalnej „piaskownicy”. Jedną opcją są symulatory i wirtualne urządzenia (np. wirtualne routery i firewalle), na których pipeline będzie generował i wdrażał konfigurację przed produkcją. Inną – kilka fizycznych urządzeń testowych, nawet jeśli nie odwzorowują całej topologii 1:1.
Jeśli nie masz sprzętu, możesz zacząć od „suchych” testów: linting, generowanie konfiguracji, porównanie diff, testy jednostkowe polityk (np. czy konkretna reguła firewall przepuszcza określony ruch). Zadaj sobie pytanie: jaki najmniejszy wycinek twojej sieci da się odseparować i potraktować jako środowisko testowe, choćby na kilka godzin tygodniowo?
Jak Network as Code pomaga w audytach i zgodności z politykami bezpieczeństwa?
Gdy konfiguracja sieci jest kodem w Git, każdy commit ma autora, datę, opis i powiązanie z ticketem. Dla audytora możesz w kilka minut odpowiedzieć na pytania typu: „kto zmienił tę regułę firewall i dlaczego?”. Nie szukasz już po logach z terminala czy starych plikach tekstowych, tylko pokazujesz historię repozytorium i pipeline’y, które wdrażały zmiany.
Dodatkowo możesz zakodować polityki bezpieczeństwa w testach: np. niedozwolone porty, zakazane kierunki ruchu, wymagane strefy. Pipeline po prostu nie przepuści commitu, który łamie zasady. Zastanów się: które z twoich dzisiejszych „reguł dobrych praktyk” da się przełożyć na konkretne testy automatyczne, zamiast polegać na pamięci inżynierów?
Jak uniknąć chaosu, gdy kilka zespołów pracuje nad jedną infrastrukturą sieciową?
Podstawą jest wspólne repozytorium i jasny podział odpowiedzialności. Możesz wyodrębnić katalogi lub role dla poszczególnych domen: zespół sieciowy zarządza routingiem i adresacją, zespół bezpieczeństwa – obiektami i politykami firewalli, zespół aplikacyjny – definicjami VIP-ów i pooli na load balancerach. Wszystkie zmiany przechodzą przez te same zasady: branch → merge request → review → pipeline.
Dobrą praktyką jest też powiązanie zmian z systemem ticketowym (ITSM) oraz wymaganie, aby każdy merge request odnosił się do konkretnego zgłoszenia. Zadaj sobie pytanie: czy dziś jesteś w stanie jednoznacznie wskazać, który commit zablokował konkretny system i kto go zatwierdził? Jeśli nie, CI/CD z Network as Code jest naturalnym krokiem naprzód.
Jakie korzyści biznesowe realnie daje automatyzacja sieci i CI/CD?
Najczęściej odczuwalne efekty to krótsze okna serwisowe i mniej awarii po zmianach. Zamiast wielogodzinnych prac w nocy masz krótsze, lepiej przewidywalne wdrożenia, które w razie problemów można szybko cofnąć, bo poprzedni stan konfiguracji jest zapisany w repozytorium. Pomyśl, ile razy ostatnio „odkręcanie” zmiany zajęło więcej czasu niż sama zmiana.
Drugi obszar to standaryzacja i skalowalność. Ten sam typ routera czy firewalla jest konfigurowany według jednego wzorca, co upraszcza utrzymanie i onboarding nowych osób w zespole. Trzeci – transparentność: łatwiej rozliczyć, kto co zmienił, lepiej tłumaczyć się przed audytem, a jednocześnie szybciej diagnozować incydenty powstałe po wdrożeniu.
Co warto zapamiętać
- Ręczne wdrożenia przez SSH, copy-paste i „konfiguracja w Excelu” dają iluzję kontroli, a w praktyce kończą się brakiem historii zmian, niespójnością konfiguracji i zależnością od pojedynczych adminów – jak dziś wygląda twoje „źródło prawdy” o sieci?
- Nieprzewidywalne efekty zmian, długie nocne okna serwisowe, problemy z audytami i rozjazd między zespołami (sieć, bezpieczeństwo, aplikacje) to naturalna konsekwencja braku ustandaryzowanego procesu wdrożeń.
- CI/CD dla sieci ma konkretny cel: ograniczyć przerwy w działaniu po zmianach, uporządkować konfiguracje, jasno powiązać każdą modyfikację z osobą, ticketem i commitem oraz wbudować kontrolę polityk bezpieczeństwa w sam proces wdrożeniowy.
- Przeskok z „pojedynczych skryptów w szufladzie” do CI/CD polega na tym, że zmiany nie są już odpalane ręcznie z laptopa admina, lecz przechodzą przez wspólny, przejrzysty pipeline: commit → testy → walidacje → wdrożenie – jakie swoje obecne skrypty mógłbyś w ten sposób wpiąć?
- Network as Code to nie tylko automatyzujące skrypty, ale pełne opisanie sieci (adresacja, routing, polityki bezpieczeństwa, VIP-y) w wersjonowanych plikach tekstowych z code review, testami i historią, dzięki czemu zespół może odtworzyć dowolny stan sprzed tygodni czy miesięcy.






