NMState: una eina declarativa de configuració de xarxes


L'ecosistema Linux ofereix nombroses maneres de configurar les xarxes, inclosa la popular utilitat GUI nmtui. Aquesta guia presenta una altra eina de configuració de xarxa coneguda com NMState

NMState és un gestor de xarxa declaratiu per configurar la xarxa en amfitrions Linux. És una biblioteca que proporciona una eina de línia d'ordres que gestiona la configuració de la xarxa de l'amfitrió. Gestiona la xarxa d'amfitrió mitjançant una API declarativa en direcció nord. En el moment d'escriure aquesta guia, el dimoni NetworkManager és l'únic proveïdor compatible amb NMState.

En aquesta guia, analitzem alguns dels exemples d'ús de l'eina NMState. Per a aquesta guia, ho demostrarem amb Fedora Linux.

La gestió de la xarxa pot adoptar dos enfocaments: imperatiu i declaratiu. En l'enfocament imperatiu, definiu explícitament l'estat de xarxa d'una interfície executant ordres al terminal. El focus està en el com.

Per exemple, per fer caure una xarxa mitjançant l'enfocament imperatiu, executeu l'ordre:

$ sudo ifconfig enp0s3 down

D'altra banda, l'enfocament declaratiu utilitza un fitxer YAML per aplicar els canvis a una configuració. La majoria de les eines d'orquestració de DevOps, com ara Kubernetes, utilitzen aquest enfocament per desplegar aplicacions pods mitjançant un fitxer YAML.

Aquest enfocament proporciona el que comunament es coneix com a Infraestructura com a codi (IaC) als cercles de DevOps. Això millora l'automatització de la configuració de xarxa a l'amfitrió i proporciona una manera ràpida i més fiable de fer múltiples canvis a una interfície de xarxa amb errors mínims.

Ara, canviem de marxa i veiem com podeu utilitzar l'eina de configuració NMState per configurar les vostres interfícies de xarxa a Linux.

Pas 1: instal·leu l'eina de configuració de xarxa NMState

Farem rodar la pilota instal·lant el Nmstate. Primer, comproveu la disponibilitat del paquet des dels repositoris de Fedora de la següent manera:

$ sudo dnf search nmstate

A la sortida, podem veure que el gestor de xarxa està disponible als dipòsits oficials.

A continuació, instal·leu NMstate de la següent manera. Això funciona amb Fedora 31 i versions posteriors.

$ sudo dnf install nmstate

L'ordre instal·la l'API del gestor de xarxa NMState juntament amb altres dependències de Python.

Un cop finalitzada la instal·lació, verifiqueu que el paquet nmstate estigui instal·lat de la següent manera.

$ rpm -qi nmstate

Per a Linux basat en RHEL, activeu primer el dipòsit copr.

$ sudo dnf copr enable nmstate/nmstate-stable

A continuació, instal·leu NMstate de la següent manera.

$ sudo dnf install nmstate

Consulteu les instruccions addicionals sobre com instal·lar NMState des de la font.

Un cop instal·lat, podeu comprovar la versió de NMstate instal·lada de la següent manera.

$ nmstatectl version

1.0.2

Utilitzant l'eina de configuració NMState a Linux

Amb NMstate instal·lat, anem a parlar de com podeu treure el màxim profit de l'API del gestor de xarxa.

Per veure la configuració de xarxa actual de la vostra interfície de xarxa, executeu l'ordre següent. Aquí teniu la configuració de la vostra interfície enp0s3.

$ nmstatectl show enp0s3

La sortida es divideix en 4 seccions diferents:

  • dns-resolver: aquesta secció conté la configuració del servidor de noms per a la interfície concreta.
  • rute-rules: això estipula les regles d'encaminament.
  • rutes: inclou rutes estàtiques i dinàmiques.
  • Interfícies: aquesta secció especifica la configuració ipv4 i ipv6.

Canvi de la configuració de xarxa a Linux

Podeu utilitzar l'eina de configuració NMState per configurar els vostres amfitrions a l'estat desitjat mitjançant els modes interactius o basats en fitxers.

  • Interactiu: això edita una interfície de xarxa mitjançant l'ordre d'edició nmstatectl. Aquesta ordre obre un editor de text que està definit per la variable d'entorn EDITOR. Un cop desats els canvis, NMState aplica la nova configuració immediatament tret que es detectin errors de sintaxi.
  • Basat en fitxers: en el mode basat en fitxers, la configuració de la interfície s'aplica mitjançant un fitxer YAML o JSON mitjançant l'ordre nmstatectl apply.

Ara ens embrutem les mans i comproveu com podeu modificar la configuració de la xarxa mitjançant NMState.

El nostre sistema Fedora té dues interfícies de xarxa actives amb la configuració següent:

$ ip -br -4 a
lo               UNKNOWN        127.0.0.1/8 
enp0s3           UP             192.168.2.104/24 
enp0s8           UP             192.168.2.103/24 

Utilitzarem el mode interactiu per canviar la MTU (Maximum Transmission Unit) de la interfície de xarxa enp0s3. Per defecte, s'estableix en 1500 com es mostra.

$ ifconfig

Ho canviarem a 4000. Ho farem utilitzant l'ordre d'edició nmstatectl de la següent manera.

$ sudo nmstatectl edit enp0s3

Això obre la configuració en un editor de text. Per al nostre cas, s'obre a l'editor vim. A continuació, desplaceu-vos cap avall i localitzeu el paràmetre mtu. Canviarem el valor a 4000, de la mateixa manera que editaríem un fitxer a vim. Després desarem els canvis.

Quan deseu i sortiu del fitxer, veureu alguna sortida codificada al terminal mentre NMstate desa els canvis. No cal cap intervenció, així que només cal quedar-se quiet.

Ara confirmem que el canvi s'ha fet.

$ ifconfig

Des de la sortida del terminal, podem veure que hem canviat correctament el MTU a 4000 des del valor predeterminat de 1500.

Modifiquem ara la configuració utilitzant el mode basat en fitxers. En aquest exemple, desactivarem IPv6 per a la interfície de xarxa enp0s8. El primer pas és crear un fitxer YAML que especificarà l'estat desitjat de la interfície de xarxa enp0s8.

$ sudo nmstatectl show enp0s8 > enp0s8.yml

A continuació, editarem el fitxer YAML de la següent manera.

$ sudo vim enp0s8.yml

Desplaceu-vos cap avall fins a la secció ipv6. Per desactivar IPv6, configureu el paràmetre habilitat com a fals i suprimiu les línies que s'hagin tallat.

Deseu la configuració i apliqueu el nou estat mitjançant el fitxer YAML de la manera següent.

$ sudo nmstatectl apply enp0s8.yml

Ara executeu l'ordre que es mostra per verificar que IPv6 s'ha desactivat. La sortida que es mostra mostra que l'IPv6 per a la interfície de xarxa enp0s8 està en blanc, la qual cosa implica que hem desactivat correctament IPv6 a la interfície.

$ ip -br a 

Una altra funcionalitat molt útil que proporciona NMstate és la possibilitat de configurar temporalment l'estat de xarxa desitjat. Un cop estigueu satisfet amb la configuració, podeu continuar i fer els canvis permanents. En cas contrari, els canvis fets tornaran a la configuració inicial un cop expiri el temps d'espera. El temps d'espera predeterminat és de 60 segons.

Per demostrar-ho, establirem temporalment una IP estàtica a la interfície enp0s3 i desactivarem DHCP. Una vegada més, accediu al fitxer mitjançant un editor de text.

$ sudo vim enp0s3.yml

Desplaceu-vos fins a la secció ipv4. Especifiqueu la IP estàtica: en el nostre cas, 192.168.2.150 i suprimiu les línies que s'han ratllat. A més, assegureu-vos d'establir el paràmetre dhcp com a fals.

Deseu el fitxer i confirmeu temporalment els canvis de la manera següent.

$ sudo nmstatectl apply --no-commit --timeout 20 enp0s3.yml

L'opció --no-commit aplica temporalment els canvis durant un període definit per l'opció --timeout que, en aquest exemple, és de 20 segons.

Per comprovar l'aplicació temporal dels canvis, comprovarem la configuració de la IP en un interval de temps de 20 segons.

$ ip -br a 

A la sortida, podeu veure que la configuració IP de la interfície va tornar a DHCP després de l'interval de temps de 20 segons. L'adreça IP va tornar a 192.168.2.104 des de l'anterior IP configurada estàticament que era 192.168.2.150.

És cert que l'eina NMState és una eina convenient per configurar les interfícies de xarxa. És una eina declarativa que aplica l'estat de configuració desitjat de la interfície d'un amfitrió mitjançant l'API NetworkManager.

L'estat es defineix fàcilment mitjançant l'enfocament interactiu o mitjançant el mètode basat en fitxers que utilitza un fitxer YAML preconfigurat. Això millora l'automatització de les tasques de configuració i la reducció d'errors durant la configuració.