Automatická konfigurace portů pro Cisco a Juniper
15.09.2021 | Tag Sítě
Konfigurace portů na switchi je jeden z nejběžnějších úkolů správce. Pomocí předdefinovaného setu příkazů se pak dá port nastavit velmi rychle a jednotným způsobem. Chtěla bych ukázat, jak se toho dá dosáhnout na Cisco a Juniper EX switchích.
Teď necháme stranou nějaké robustní nástroje jako je Ansible, byť je to asi nejlepší způsob, jak si ulehčit život od rutinních malých úkolů. Určitou míru automatizace umožňují i samotné switche, dokonce i ty s původním IOS systémem, takže jde o poměrně starou věc. V našem prostředí je takový rutinní task konfigurace portu, což musí dělat každý z adminů nehledě na jeho specializaci. Aby se předešlo chybám a konfigurace se trochu zjednodušila, máme připravené sety konfigurace pomocí maker.
Cisco macro dovoluje vytvořit a pojmenovat si set příkazů a tento set následně volat, kdykoliv je potřeba. Makra se můžou vztahovat jak na globální konfiguraci, tak právě na specifickou konfiguraci, jako je konfigurace portů. Konfigurace maker má svá specifika, například:
- Existující makro se nedá upravit. Pro opravu se musí smazat a vytvořit znovu.
- Názvy maker jsou case sensitive. Makro test a Test jsou dva různé sety.
- Makro by nemělo skákat mezi konfiguračními módy.
- Makro nepřepisuje konfiguraci, přidává ji. Proto je dobré například port před aplikováním makra vyčistit.
Makra umějí používat i proměnné, nebo klíčová slova. Dá se tak třeba dynamicky doplnit číslo VLAN během zavolání makra. Je to hezká schopnost, ale osobně ji moc nevyužívám a spíše vytvářím statický set, který se pouze zavolá. Teď pár příkladů.
Makro se vždy definuje v konfiguračním módu pomocí macro name //název makra//. Každý řádek je jeden příkaz, konec zadávání makra se definuje pomocí @, což nám říká i sám IOS. První příklad je makro s jedním klíčovým slovem (může jich samozřejmě být víc). Klíčové slovo stačí umístit v příkazu tam, kam se má následně vyplnit jeho hodnota. Pak se pomocí #macro keywords klíčové slovo označí.
Switch(config)#macro name test
Enter macro commands one per line. End with the character '@'.
username test priv 15 secret $heslo
#macro keywords $heslo
@
Dále makro bez klíčového slova, které natvrdo nastavuje port jako accesový s VLAN 10.
Switch(config)#macro name port
Enter macro commands one per line. End with the character '@'.
description port_PC
switchport mode access
switchport access vlan 10
spanning-tree portfast
spanning-tree bpduguard enable
@
Vytvořené makro se dá zavolat buď pomocí macro trace, nebo pomocí macro apply. Macro trace do konzole vypíše to, co právě aplikuje. Macro apply aplikuje nadefinovaný set příkazů bez vypsání toho, co dělá. V globální konfiguraci se makro zavolá pomocí macro global. První příklad je zavolání makra v globální konfiguraci s klíčovým slovem. „Heslo“ je dříve zvolené klíčové slovo a „tohlejeheslo“ je hodnota toho klíčového slova, která se do příkazu doplní. Je vidět, že u macro trace makro řeklo, co aplikovalo.
Switch(config)#macro global trace test heslo tohlejeheslo
Applying command... 'username test priv 15 secret $tohlejeheslo'
Switch(config)#
Druhý příklad je konfigurace tří portů pomocí makra „port“. Zde je ukázáno to zmíněné vyčištění konfigurace z portu, aby se k tomu nepřimotala konfigurace z makra. Makro se dá volat nad rozsahy portů i nad jednotlivými porty samostatně.
Switch#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Switch(config)#default int range fa0/22-24
Switch(config)#int range fa0/22-24
Switch(config-if-range)#macro apply port
Switch(config-if-range)#exit
Switch(config)#do sh run int fa0/22
Building configuration...
Current configuration : 186 bytes
interface FastEthernet0/22
description port_PC
switchport access vlan 10
switchport mode access
macro description port
spanning-tree portfast
spanning-tree bpduguard enable
end
Pomocí show parser macro brief se dají vypsat všechna existující makra. Cisco switche v sobě mají automaticky několik maker, které obsahují podle Cisco optimální konfiguraci pro specifické účely. Uživatelsky vytvořená makra jsou pak součástí konfigurace a ukážou se v jejím výpisu.
Switch#sh parser macro brief
default global : cisco-global
default interface: cisco-desktop
default interface: cisco-phone
default interface: cisco-switch
default interface: cisco-router
default interface: cisco-wireless
customizable : test
customizable : port
Switch#
To by bylo k Cisco řešení pro jednodušší konfiguraci portů. Něčeho podobného jsem chtěla dosáhnout také s Juniperem. Nakonec jsem skončila u možnosti, která mi zaručí stejný výsledek, ale úplně jiným způsobem. Zde půjde o seskupování portů se stejnou konfigurací do skupin, ze kterých si porty nastavení dědí. Není to přímý ekvivalent maker, ale pro snadnou konfiguraci portů se to hodí stejně.
Pomocí interface-range se na Juniperu dá vytvořit konfigurace pro skupinu portů se stejnými vlastnostmi. Porty, které tuto konfiguraci mají mít, se pak do skupiny přidávají jako členové. Má to oproti Ciscu nevýhodu – vytvořená konfigurace pomocí interface-range musí mít aspoň jednoho člena, tj. nedá se připravit dopředu bez aspoň jednoho portu. Na druhou stranu, oproti Cisco macru je interface-range příjemnější na použití, protože konfigurace portů probíhá jejich přiřazením ke skupině. Opět ukázka.
Konfigurace portu u Juniperu a u Cisca se dost liší. Cisco vše vztažené k portu nastavuje pod portem samotným. Juniper má naopak sekce konfigurace, do kterých se porty začleňují. To pro pochopení, proč je konfigurace tak rozsáhlá. Vlastnosti portu se definují na více místech.
Vytáhla jsem konfiguraci pro access point a pro PC port. port_AP a port_PC jsou názvy skupin portů, kam se později budou jednotlivé porty přiřazovat.
set protocols rstp interface port_AP edge
set protocols lldp interface port_AP
set protocols lldp-med interface port_AP
set poe interface port_AP
set interfaces interface-range port_AP description CAPWAP
set interfaces interface-range port_AP unit 0 family ethernet-switching port-mode trunk
set interfaces interface-range port_AP unit 0 family ethernet-switching vlan members 10
set interfaces interface-range port_AP unit 0 family ethernet-switching vlan members 11
set interfaces interface-range port_AP unit 0 family ethernet-switching vlan members 12
set interfaces interface-range port_AP unit 0 family ethernet-switching native-vlan-id 13
set protocols rstp interface port_PC edge
set protocols lldp interface port_PC
set protocols lldp-med interface port_PC
set poe interface port_PC
set ethernet-switching-options voip interface port_PC vlan 22
set ethernet-switching-options voip interface port_PC forwarding-class assured-forwarding
set interfaces interface-range port_PC description zasuvka_IT
set interfaces interface-range port_PC unit 0 family ethernet-switching port-mode access
set interfaces interface-range port_PC unit 0 family ethernet-switching vlan members 3
Tady už je samotné přiřazení portů do skupiny. Port ge-0/0/0 je členem skupiny pro AP a port ge-0/0/1 je členem skupiny pro PC. Oba porty pak mají ještě návdavkem nakonfigurovaný vlastní popis, který přebije popis z interface group. Je potřeba hlídat členství portu v jednotlivých skupinách, aby se konfigurace nějak nechtěně nemíchala.
set interfaces interface-range port_AP member ge-0/0/0
set interfaces ge-0/0/0 description AP
set interfaces interface-range port_PC member ge-0/0/1
set interfaces ge-0/0/1 description 1/14
Co se po commitu děje, je lepší ukázat pomocí show | display inheritance. Tímto příkazem se vypíše konfigurace spolu s popisem toho, co bylo odkud a proč zděděno. Výpis jsem zkrátila jen na část, kde je hezky vidět dědění konfigurace portů.
admin@switch# show | display inheritance
ge-0/0/1 {
description 1/14;
unit 0 {
##
## 'ethernet-switching' was expanded from interface-range 'port_PC'
##
family ethernet-switching {
##
## 'access' was expanded from interface-range 'port_PC'
##
port-mode access;
##
## 'vlan' was expanded from interface-range 'port_PC'
##
vlan {
##
## '3' was expanded from interface-range 'port_PC'
##
members 3;
}
}
}
}
ge-0/0/0 {
description AP;
unit 0 {
##
## 'ethernet-switching' was expanded from interface-range 'port_AP'
##
family ethernet-switching {
##
## 'trunk' was expanded from interface-range 'port_AP'
##
port-mode trunk;
##
## 'vlan' was expanded from interface-range 'port_AP'
##
vlan {
##
## '10' was expanded from interface-range 'port_AP'
## '11' was expanded from interface-range 'port_AP'
## '12' was expanded from interface-range 'port_AP'
##
members [ 10 11 12 ];
}
##
## '13' was expanded from interface-range 'port_AP'
##
native-vlan-id 13;
}
}
}
Zde je jiný příklad – port 0/0/19 se z jedné skupiny přeřazuje do druhé. Pomocí show | compare se objeví změny oproti původní konfiguraci.
admin@switch# delete interfaces interface-range port_FREE member ge-0/0/19
{master:0}[edit]
admin@switch# set interfaces interface-range port_PC member ge-0/0/19
{master:0}[edit]
admin@switch# show | compare
[edit interfaces interface-range port_PC]
member ge-0/0/18 { ... }
+ member ge-0/0/19;
[edit interfaces interface-range port_FREE]
- member ge-0/0/19;
{master:0}[edit]
Snad je trochu jasné, co jsem chtěla ukázat. Juniper i Cisco nabízí spoustu cest, jak si konfiguraci zjednodušit. Výše představené způsoby jsou jedny z nich.