Hallo, Habr!
In dit artikel willen we het hebben over de automatisering van netwerk-infrastructuur. We zullen een werkingsschema van een netwerk presenteren dat functioneert binnen een klein, maar zeer trots bedrijf. Alle overeenkomsten met echt netwerkapparatuur zijn toevallig. We zullen een case bekijken die zich in dit netwerk heeft voorgedaan, wat had kunnen leiden tot een langdurige stillegging van het bedrijf en aanzienlijke financiële verliezen. De oplossing voor deze case past heel goed in het concept van 'Automatisering van netwerk-infrastructuur'. Met behulp van automatiseringsmiddelen zullen we laten zien hoe we complexe taken efficiënt binnen korte tijd kunnen oplossen en we zullen nadenken over waarom het beter is om deze taken op deze manier aan te pakken en niet anders (via de console).
Disclaimer
Onze belangrijkste tools voor automatisering zijn Ansible (als automatiseringsmiddel) en Git (als opslagplaats voor Ansible playbooks). We willen meteen opmerken dat dit geen kennismakingsartikel is waarin we de logica van Ansible of Git bespreken en de basisprincipes uitleggen (bijvoorbeeld wat rolmodules, inventarisbestanden en variabelen in Ansible zijn, of wat er gebeurt wanneer je de opdrachten git push of git commit invoert). Dit verhaal gaat niet over hoe je kunt oefenen met Ansible, of hoe je NTP of SMTP op apparatuur instelt. Dit verhaal gaat over hoe je snel en bij voorkeur zonder fouten een netwerkprobleem kunt oplossen. Het is ook wenselijk om een goed begrip te hebben van hoe het netwerk werkt, in het bijzonder wat de TCP/IP-protocolstack, OSPF, en BGP zijn. We laten de keuze voor Ansible en Git ook buiten beschouwing. Als je nog steeds twijfelt over een specifieke oplossing, raden we ten zeerste aan om het boek 'Network Programmability and Automation. Skills for the Next-Generation Network Engineer' van Jason Edelman, Scott S. Lowe en Matt Oswalt te lezen.
Laten we ter zake komen.
Taakstelling
Stel je de situatie voor: 3 uur 's nachts, je ligt diep te slapen en je droomt. Dan gaat je telefoon. De technisch directeur belt:
— Ja?
— ###, ####, #####; de cluster van de firewalls is uitgevallen en komt niet meer omhoog!!!
Je wrijft in je ogen, probeert te begrijpen wat er aan de hand is en je probeert je voor te stellen hoe dit in hemelsnaam heeft kunnen gebeuren. Je hoort de haren uit het hoofd van de directeur rijden en hij vraagt je om terug te bellen, omdat hij aan de andere lijn de algemeen directeur aan de lijn heeft.
Na een halfuur heb je de eerste informatie van de nachtdienst verzameld en iedereen wakker gemaakt die je kon wekken. Uiteindelijk heeft de technische directeur niet gelogen, alles klopt, de hoofdcluster van de firewalls is uitgevallen en geen enkele basisactie brengt het weer tot leven. Alle diensten die het bedrijf biedt werken niet.
Kies een probleem naar jouw keuze, iedereen zal wel iets herinneren. Bijvoorbeeld, na de nachtelijke update werkte alles goed zonder grote belasting, en iedereen ging tevreden slapen. Toen de drukte kwam, raakten de buffers van de interfaces vol door een bug in de netwerkdriver.
De situatie kan goed worden omschreven door Jackie Chan.

Dank je, Jackie.
De situatie is niet erg prettig, is het wel?
Laten we even onze netwerkspecialist met zijn droevige gedachten met rust laten.
Laten we bespreken hoe de situatie verder zal ontwikkelen.
We stellen de volgende volgorde van presentatie van het materiaal voor.
- Laten we het netwerkdiagram bekijken en analyseren hoe het werkt;
- We zullen beschrijven hoe we instellingen van de ene router naar de andere verplaatsen met behulp van Ansible;
- We zullen het in het algemeen hebben over de automatisering van IT-infrastructuur.
Netwerkdiagram en beschrijving.
Schema

Laten we het logische diagram van onze organisatie bekijken. We zullen geen specifieke leveranciers van apparatuur noemen, dit is in het kader van dit artikel niet relevant. (De oplettende lezer zal zelf kunnen raden welke apparatuur wordt gebruikt.). Dit is precies een van de goede voordelen van werken met Ansible, bij de configuratie maakt het ons in het algemeen niet uit welke apparatuur het is. Gewoon ter verduidelijking, dit is apparatuur van bekende leveranciers, zoals Cisco, Juniper, Check Point, Fortinet, Palo Alto… je kunt je eigen optie invullen.
We hebben twee hoofd taken met betrekking tot het verplaatsen van verkeer:
- Zorg voor de publicatie van onze diensten, die de business van het bedrijf zijn;
- Zorg voor de verbinding met de filialen, de externe datacenter en externe organisaties (partners en klanten), evenals de internetverbinding van de filialen via het hoofdkantoor.
Laten we beginnen met de belangrijkste elementen:
- Twee randrouters (BRD-01, BRD-02);
- Cluster van firewalls (FW-CLUSTER);
- Core switch (L3-CORE);
- Router die als reddingsboei zal dienen (in de loop van het probleem zullen we de netwerkinstellingen van FW-CLUSTER naar EMERGENCY verplaatsen) (EMERGENCY);
- Switches voor netwerkbeheer (L2-MGMT);
- Virtuele machine met Git en Ansible (VM-AUTOMATION);
- Laptop waarop de tests en ontwikkeling van playbooks voor Ansible (Laptop-Automation) plaatsvinden.
In het netwerk is het dynamische routeringsprotocol OSPF ingesteld met de volgende gebieden:
- Area 0 – het gebied waarin de routers zitten die verantwoordelijk zijn voor het verplaatsen van verkeer in de EXCHANGE-zone;
- Area 1 – het gebied waarin de routers zitten die verantwoordelijk zijn voor de werking van de bedrijfsservices;
- Area 2 – het gebied waarin de routers zitten die verantwoordelijk zijn voor de routering van managementverkeer;
- Area N – gebieden van filiaalnetwerken.
Op de randrouters is per virtuele router (VRF-INTERNET) een eBGP full view opgezet met de bijbehorende toegewezen AS. Tussen de VRF's is iBGP ingesteld. Het bedrijf beschikt over een pool van witte adressen, die zijn gepubliceerd op deze VRF-INTERNET. Een deel van de witte adressen wordt rechtstreeks gerouteerd naar de FW-CLUSTER (de adressen waarop de bedrijfsservices draaien), een deel wordt gerouteerd via de EXCHANGE-zone (interne bedrijfsservices die externe IP-adressen vereisen en externe NAT-adressen voor de kantoren). Vervolgens komt het verkeer op de virtuele routers terecht die zijn gemaakt op de L3-CORE met witte en grijze adressen (veiligheidszones).
In het managementnetwerk worden toegewezen switches gebruikt en vormt het een fysiek gescheiden netwerk. Het managementnetwerk is ook verdeeld in veiligheidszones.
De EMERGENCY-router dupliceert fysiek en logisch de FW-CLUSTER. Alle interfaces zijn uitgeschakeld, behalve diegene die naar het managementnetwerk kijken.
Automatisering en zijn beschrijving
We hebben begrepen hoe het netwerk werkt. Laten we stap voor stap bekijken wat we gaan doen om het verkeer van de FW-CLUSTER naar de EMERGENCY te verplaatsen:
- Schakel de interfaces op de kernswitch (L3-CORE) uit die hem met de FW-CLUSTER verbinden;
- Schakel de interfaces op de L2-MGMT kernswitch uit die hem met de FW-CLUSTER verbinden;
- Configureer de EMERGENCY-router (standaard zijn op deze router alle interfaces uitgeschakeld, behalve diegene die met L2-MGMT zijn verbonden):
- Schakel de interfaces op de EMERGENCY in;
- Configureer het externe IP-adres (voor NAT), dat op de FW-Cluster was;
- Genereer gARP-aanvragen, zodat in de arp-tabellen van de L3-CORE de MAC-adressen van de FW-Cluster naar de EMERGENCY veranderen;
- Voeg een standaardroute statisch toe naar BRD-01, BRD-02;
- Creëer NAT-regels;
- Zet OSPF Area 1 op de EMERGENCY aan;
- Zet OSPF Area 2 op de EMERGENCY aan;
- Verander de kosten van routes in Area 1 naar 10;
- Verander de kosten van de standaardroute in Area 1 naar 10;
- Verander IP-adressen, verbonden met L2-MGMT (zoals die op de FW-CLUSTER waren);
- We genereren gARP-verzoeken zodat de MAC-adressen in de L2-MGMT ARP-tabellen veranderen van FW-CLUSTER naar EMERGENCY.
Laten we teruggaan naar de oorspronkelijke probleemstelling. Het is drie uur 's nachts, enorme stress, een fout op een van de stappen kan leiden tot nieuwe problemen. Ben je klaar om opdrachten via de CLI in te voeren? Yes? Oké, ga dan eerst je gezicht even wassen, drink een kop koffie en verzamel je moed.
Bruce, help aub de jongens.

En wij gaan door met het ontwikkelen van onze automatisering.
Onderstaand is het werkingsschema van de playbook in termen van Ansible. Dit schema weerspiegelt wat we hierboven hebben beschreven, maar is nu de specifieke implementatie in Ansible.

Op dit moment hebben we beseft wat we moeten doen, we hebben de playbook ontwikkeld, getest, en zijn nu klaar om het uit te voeren.
Nog een kleine zijstap. De eenvoud van het verhaal mag je niet misleiden. Het schrijven van playbooks was niet zo eenvoudig en snel als het lijkt. De tests duurden nogal lang, er is een virtuele testomgeving opgezet, de oplossing is meerdere keren getest en er zijn ongeveer 100 tests uitgevoerd.
We starten... Het gevoel is dat alles heel langzaam gaat, ergens is er een fout, en uiteindelijk werkt er iets niet. Het voelt als een sprong met een parachute, waarbij de parachute niet meteen wil openen... dat is normaal.
Hierna lezen we het resultaat van de uitgevoerde Ansible playbook-operaties (IP-adressen zijn ter bescherming vervangen):
[xxx@emergency ansible]$ ansible-playbook -i /etc/ansible/inventories/prod_inventory.ini /etc/ansible/playbooks/emergency_on.yml
PLAY [------->Noodgeval op VCF] ********************************************************
TAKEN [vcf_junos_emergency_on : Schakel PROD interfaces naar FW-CLUSTER uit] *********************
gewijzigd: [vcf]
PLAY [------->Noodgeval op MGMT-CORE] ************************************************
TAKEN [mgmt_junos_emergency_on : Schakel MGMT interfaces naar FW-CLUSTER uit] ******************
gewijzigd: [m9-03-sw-03-mgmt-core]
PLAY [------->Noodgeval op] ****************************************************
TAKEN [mk_routeros_emergency_on : Schakel EXT-INTERNET interface in] **************************
gewijzigd: [m9-04-r-04]
TAKEN [mk_routeros_emergency_on : Genereer gARP voor EXT-INTERNET interface] ****************
gewijzigd: [m9-04-r-04]
TAKEN [mk_routeros_emergency_on : Schakel statische standaardroute naar EXT-INTERNET in] ****************
gewijzigd: [m9-04-r-04]
TAKEN [mk_routeros_emergency_on : Wijzig NAT-regel naar EXT-INTERNET interface] ****************
gewijzigd: [m9-04-r-04] => (item=12)
gewijzigd: [m9-04-r-04] => (item=14)
gewijzigd: [m9-04-r-04] => (item=15)
gewijzigd: [m9-04-r-04] => (item=16)
gewijzigd: [m9-04-r-04] => (item=17)
TAKEN [mk_routeros_emergency_on : Schakel OSPF Area 1 PROD in] ******************************
gewijzigd: [m9-04-r-04]
TAKEN [mk_routeros_emergency_on : Schakel OSPF Area 2 MGMT in] *****************************
gewijzigd: [m9-04-r-04]
TAKEN [mk_routeros_emergency_on : Wijzig kosten van OSPF Area 1 interfaces naar 10] *****************
gewijzigd: [m9-04-r-04] => (item=VLAN-1001)
gewijzigd: [m9-04-r-04] => (item=VLAN-1002)
gewijzigd: [m9-04-r-04] => (item=VLAN-1003)
gewijzigd: [m9-04-r-04] => (item=VLAN-1004)
gewijzigd: [m9-04-r-04] => (item=VLAN-1005)
gewijzigd: [m9-04-r-04] => (item=VLAN-1006)
gewijzigd: [m9-04-r-04] => (item=VLAN-1007)
gewijzigd: [m9-04-r-04] => (item=VLAN-1008)
gewijzigd: [m9-04-r-04] => (item=VLAN-1009)
gewijzigd: [m9-04-r-04] => (item=VLAN-1010)
gewijzigd: [m9-04-r-04] => (item=VLAN-1011)
gewijzigd: [m9-04-r-04] => (item=VLAN-1012)
gewijzigd: [m9-04-r-04] => (item=VLAN-1013)
gewijzigd: [m9-04-r-04] => (item=VLAN-1100)
TAKEN [mk_routeros_emergency_on : Wijzig standaard kosten voor OSPF area1 naar 10] ******************
gewijzigd: [m9-04-r-04]
TAKEN [mk_routeros_emergency_on : Wijzig IP-adressen MGMT interfaces] ********************
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n.254', u'name': u'VLAN-803'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+1.254', u'name': u'VLAN-805'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+2.254', u'name': u'VLAN-807'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+3.254', u'name': u'VLAN-809'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+4.254', u'name': u'VLAN-820'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+5.254', u'name': u'VLAN-822'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+6.254', u'name': u'VLAN-823'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+7.254', u'name': u'VLAN-824'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+8.254', u'name': u'VLAN-850'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+9.254', u'name': u'VLAN-851'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+10.254', u'name': u'VLAN-852'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+11.254', u'name': u'VLAN-853'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+12.254', u'name': u'VLAN-870'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+13.254', u'name': u'VLAN-898'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+14.254', u'name': u'VLAN-899'})
TAKEN [mk_routeros_emergency_on : Genereer gARPs voor MGMT interfaces] *********************
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n.254', u'name': u'VLAN-803'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+1.254', u'name': u'VLAN-805'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+2.254', u'name': u'VLAN-807'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+3.254', u'name': u'VLAN-809'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+4.254', u'name': u'VLAN-820'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+5.254', u'name': u'VLAN-822'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+6.254', u'name': u'VLAN-823'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+7.254', u'name': u'VLAN-824'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+8.254', u'name': u'VLAN-850'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+9.254', u'name': u'VLAN-851'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+10.254', u'name': u'VLAN-852'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+11.254', u'name': u'VLAN-853'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+12.254', u'name': u'VLAN-870'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+13.254', u'name': u'VLAN-898'})
gewijzigd: [m9-04-r-04] => (item={u'ip': u'х.х.n+14.254', u'name': u'VLAN-899'})
PLAY RECAP ************************************************************************Klaar!
In werkelijkheid is het nog niet helemaal klaar, laten we de convergentie van dynamische routeringsprotocollen en de lading van een groot aantal routes in FIB niet vergeten. Hierop hebben we geen invloed. We wachten. Het is gelukt. Nu is het klaar.
In het dorp Vilabaggio (dat de netwerkconfiguratie niet wil automatiseren) blijven ze de borden afwassen. Bruce (althans, een andere, maar niet minder coole) probeert te begrijpen hoeveel apparatuur er nog handmatig opnieuw geconfigureerd moet worden.

Ik wil nog stilstaan bij één belangrijk punt. Hoe krijgen we alles weer terug? Na een tijdje zullen we onze FW-CLUSTER weer tot leven brengen. Dit is de hoofdapparatuur, geen reserve, het netwerk moet daarop draaien.
Voelen jullie de druk toenemen bij de netwerkbeheerders? De technische directeur zal duizend argumenten horen waarom dit niet gedaan moet worden, waarom het later kan worden gedaan. Helaas komt het werk van het netwerk neer op een verzameling van patchwork, stukken en resten van vroegere pracht. Het lijkt wel een lappendeken. Onze taak in het algemeen, niet specifiek in deze situatie, maar als IT-specialisten, is om het netwerk te brengen naar het mooie Engelse woord 'consistency', dat heel veelzijdig is en vertaald kan worden als: consistentie, tegenstrijdigheid, logica, coördinatie, systematiek, vergelijkbaarheid, samenhang. Dit is alles waar het om draait. Alleen in deze staat is het netwerk beheersbaar, begrijpen we precies wat en hoe werkt, realiseren we ons duidelijk wat veranderd moet worden, indien nodig, weten we precies waar we moeten kijken in geval van problemen. En alleen in zo'n netwerk kunnen we trucs uitvoeren zoals degenen die we zojuist hebben beschreven.
Eigenlijk was er nog een playbook voorbereid dat de instellingen naar de oorspronkelijke staat terugbracht. De logica ervan is dezelfde (het is belangrijk om te onthouden dat de volgorde van taken heel belangrijk is), om dit artikel, dat al vrij lang is, niet te verlengen, hebben we besloten de uitvoering van het playbook niet te publiceren. Na zulke oefeningen zul je je veel rustiger en zelfverzekerder voelen voor de toekomst, bovendien zullen eventuele tijdelijke oplossingen die je daar hebt opgezet, zich direct aandienen.
Iedereen die dat wil, kan ons schrijven en de broncode van alle geschreven code, samen met alle playbooks, ontvangen. Contactgegevens zijn te vinden in het profiel.
Conclusies
Naar onze mening zijn de processen die geautomatiseerd kunnen worden nog niet volledig uitgekristalliseerd. Gebaseerd op wat we hebben ervaren en wat onze westerse collega's bespreken, zijn de volgende onderwerpen momenteel zichtbaar:
- Apparaat provisioning;
- Gegevensverzameling;
- Rapportage;
- Probleemoplossing;
- Naleving.
Als er interesse is, kunnen we het gesprek voortzetten over een van de aangegeven onderwerpen.
We willen ook graag nog wat nadenken over automatisering. Wat moet volgens ons de aard ervan zijn:
- Het systeem moet zonder menselijke tussenkomst functioneren en door mensen worden verbeterd. Het systeem mag niet afhankelijk zijn van mensen;
- De exploitatie moet deskundig zijn. Er ontbreekt een klasse specialisten die routinetaken uitvoeren. Er zijn experts die alle routine hebben geautomatiseerd en alleen complexe taken oplossen;
- Routine standaardtaken worden automatisch 'met een druk op de knop' uitgevoerd, zonder dat middelen worden verspild. Het resultaat van dergelijke taken is altijd voorspelbaar en duidelijk.
En waar moeten deze punten toe leiden:
- Transparantie van de IT-infrastructuur (minder risico's bij exploitatie, modernisering, implementatie. Minder downtime per jaar);
- De mogelijkheid om IT-middelen te plannen (Capacity-planning systeem — zichtbaar hoeveel er wordt verbruikt, zichtbaar hoeveel middelen vereist zijn in één systeem, en niet via e-mails en rondlopen naar de toppers van de afdelingen);
- De mogelijkheid om het aantal IT-personeel te verminderen.
Auteurs van het artikel: Alexander Tsjelovekov (CCIE RS, CCIE SP) en Pavel Kirilov. We zijn geïnteresseerd in het bespreken en voorstellen van oplossingen omtrent het onderwerp Automatisering van de IT-infrastructuur.
Bron: habr.com
