Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

En este artículo, hablaré sobre cómo configurar OpenDaylight para trabajar con el equipo de red, así como mostraré cómo a través de Postman y simples RESTCONF consultas se puede gestionar este equipo. No trabajaremos con el hardware, sino que desplegaremos pequeñas laboratorios virtuales con un solo enrutador utilizando Vrnetlab sobre Ubuntu 20.04 LTS.

Mostraré la configuración detallada primero con el ejemplo del enrutador Juniper vMX 20.1R1.11, y luego compararemos con la configuración de Cisco xRV9000 7.0.2.

Contenido

  • Conocimientos necesarios
  • Parte 1: discutimos brevemente OpenDaylight (en adelante ODL), Postman y Vrnetlab y por qué los necesitamos
  • Parte 2: descripción del laboratorio virtual
  • Parte 3: configuramos OpenDaylight
  • Parte 4: configuramos Vrnetlab
  • Parte 5: mediante Postman conectando el enrutador virtual (Juniper vMX) a ODL
  • Parte 6: obtenemos y modificamos la configuración del enrutador utilizando Postman y ODL
  • Parte 7: añadimos Cisco xRV9000
  • Conclusión
  • P.D.
  • Lista de literatura

Conocimientos necesarios

Para que el artículo no se convierta en una hoja larga, he omitido algunos detalles técnicos (con enlaces a la literatura donde se puede leer sobre ellos).

Por ello, les propongo temas que sería bueno (aunque no es estrictamente necesario) conocer antes de leer:

Parte 1: un poco de teoría

Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

  • Plataforma SDN abierta para la gestión y automatización de diversas redes, respaldada por Linux Foundation
  • Java dentro
  • Basado en el Nivel de Abstracción de Servicio Guiado por Modelos (MD-SAL)
  • Utiliza modelos YANG para crear automáticamente RESTCONF API para dispositivos de red

Módulo principal para la gestión de la red. Es a través de él que nos comunicaremos con los dispositivos conectados. Se gestiona a través de su propia API.

Se puede leer más sobre OpenDaylight aquí.

Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

  • Herramienta para probar API
  • Interfaz simple y fácil de usar

En nuestro caso, nos interesa como medio para enviar solicitudes REST a la API de OpenDaylight. Por supuesto, se pueden enviar solicitudes manualmente, pero en Postman se ve muy claro y se adapta mejor a nuestros objetivos.

Para quienes deseen profundizar: se han escrito muchos materiales educativos sobre ello (por ejemplo).

Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

  • Herramienta para desplegar enrutadores virtuales en Docker
  • Compatible con: Cisco XRv, Juniper vMX, Arista vEOS, Nokia VSR, entre otros.
  • Open Source

Un instrumento muy interesante pero poco conocido. En nuestro caso, lo utilizaremos para arrancar Juniper vMX y Cisco xRV9000 en una Ubuntu 20.04 LTS normal.

Se puede leer más sobre él en la página del proyecto.

Parte 2: trabajo de laboratorio

En el marco de este tutorial, vamos a configurar el siguiente sistema:

Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

¿Cómo funciona?

  • Juniper vMX se levantará en Docker en un contenedor (usando Vrnetlab) y funciona como un enrutador virtual ordinario.
  • ODL conectado al enrutador y permite gestionarlo.
  • Postman se ejecuta en una máquina separada y a través de él enviamos comandos ODL: para conectar/desconectar el enrutador, cambiar la configuración, etc.

Comentario sobre el dispositivo del sistema

Juniper vMX y ODL requieren bastantes recursos para su funcionamiento estable. Solo el vMX requiere 6 Gb de memoria RAM y 4 núcleos. Por lo tanto, se tomó la decisión de trasladar a todas las "pesadas" a una máquina separada (Heulett Packard Enterprise MicroServer ProLiant Gen8, Ubuntu 20.04 LTS). El enrutador, por supuesto, no "vuela" en ella, pero para pequeños experimentos es suficiente su rendimiento.

Parte 3: configurando OpenDaylight

Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

La versión actual de ODL en el momento de la redacción del artículo es Magnesium SR1

1) Instalamos Java OpenJDK 11 (para una instalación más detallada : uno de los indicadores más importantes sobre DEX).)

ubuntu:~$ sudo apt install default-jdk

2) Localizamos y descargamos la última compilación ODL desde aquí
3) Descomprimimos el archivo descargado
4) Pasamos al directorio obtenido
5) Ejecutamos ./bin/karaf

En este paso ODL debería iniciarse y nos encontraremos en la consola (Para acceso externo se utiliza el puerto 8181, que utilizaremos más adelante).

A continuación, instalamos ODL Features, destinadas a trabajar con protocolos NETCONF y RESTCONF. Para ello, en la consola ODL ejecutamos:

opendaylight-user@root> feature:install odl-netconf-topology odl-restconf-all

Con esto, la configuración más básica ODL está completa. (Se puede leer más detalladamente aquí).

Parte 4: configurando Vrnetlab

Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

Preparación del sistema

Antes de la instalación Vrnetlab es necesario instalar los paquetes requeridos para su funcionamiento. Tales como Docker, git, sshpass:

ubuntu:~$ sudo apt update
ubuntu:~$ sudo apt -y install python3-bs4 sshpass make
ubuntu:~$ sudo apt -y install git
ubuntu:~$ sudo apt install -y 
    apt-transport-https ca-certificates 
    curl gnupg-agent software-properties-common
ubuntu:~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
ubntu:~$ sudo add-apt-repository 
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu 
   $(lsb_release -cs) 
   stable"
ubuntu:~$ sudo apt update
ubuntu:~$ sudo apt install -y docker-ce docker-ce-cli containerd.io

Instalación de Vrnetlab

Para la instalación Vrnetlab clonamos el repositorio correspondiente de github:

ubuntu:~$ cd ~
ubntu:~$ git clone https://github.com/plajjan/vrnetlab.git

Pasamos al directorio vrnetlab:

ubuntu:~$ cd ~/vrnetlab

Aquí se pueden ver todos los scripts necesarios para el inicio. Tenga en cuenta que se ha creado un directorio correspondiente para cada tipo de enrutador:

ubuntu:~\/vrnetlab$ ls
CODE_OF_CONDUCT.md  config-engine-lite        openwrt           vr-bgp
CONTRIBUTING.md     csr                       routeros          vr-xcon
LICENSE             git-lfs-repo.sh           sros              vrnetlab.sh
Makefile            makefile-install.include  topology-machine  vrp
README.md           makefile-sanity.include   veos              vsr1000
ci-builder-image    makefile.include          vmx               xrv
common              nxos                      vqfx              xrv9k

Creando la imagen del enrutador

Cada enrutador que se admite Vrnetlab, tiene su propio procedimiento de configuración. En el caso de Juniper vMX solo necesitamos subir el archivo .tgz del enrutador (se puede descargar de el sitio oficial) a la carpeta vmx y ejecutar el comando make:

ubuntu:~$ cd ~\/vrnetlab\/vmx
ubuntu:~$ # Copiamos el archivo .tgz del enrutador en este directorio
ubuntu:~$ sudo make

Compilación de la imagen vMX tomará aproximadamente de 10 a 20 minutos. ¡Es un buen momento para preparar café!

¿Por qué tarda tanto, se preguntarán?

Traducción respuesta del autor a esta pregunta:

"Esto se debe a que, en el primer inicio, el VCP (Control Plane) lee el archivo de configuración que determina si funcionará como un VRR VCP en vMX. Anteriormente, este inicio se realizaba durante el inicio de Docker, pero eso significaba que el VCP siempre se reiniciaba una vez antes de que el enrutador virtual estuviera disponible, lo que llevaba a un tiempo de arranque prolongado (alrededor de 5 minutos). Ahora el primer inicio del VCP se realiza durante la construcción de la imagen de Docker, y dado que la construcción de Docker no puede ejecutarse con la opción --privileged, esto significa que qemu funciona sin aceleración de hardware KVM y, por lo tanto, la construcción tarda mucho tiempo. Durante este proceso se generan muchos registros, así que, al menos, podrás ver qué está sucediendo. Creo que la larga construcción no es tan alarmante, porque creamos la imagen una vez y la ejecutamos muchas veces."

Después, se podrá ver la imagen de nuestro enrutador en Docker:

ubuntu:~$ sudo docker image list
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
vrnetlab\/vr-vmx     20.1R1.11           b1b2369b453c        hace 3 semanas      4.43GB
debian              stretch             614bb74b620e        hace 7 semanas      101MB

Iniciamos el contenedor vr-vmx

Se inicia con el comando:

ubuntu:~$ sudo docker run -d --privileged --name jun01 b1b2369b453c

Luego podemos ver información sobre los contenedores activos:

ubuntu:~$ sudo docker container list
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS                                                 NAMES
120f882c8712        b1b2369b453c        "\/launch.py"        hace 2 minutos      En funcionamiento 2 minutos (no saludable)   22\/tcp, 830\/tcp, 5000\/tcp, 10000-10099\/tcp, 161\/udp   jun01

Conectamos al enrutador

La dirección IP de la interfaz de red del enrutador se puede obtener con el siguiente comando:

ubuntu:~$ sudo docker inspect --format '{{.NetworkSettings.IPAddress}}' jun01
172.17.0.2

Por defecto, Vrnetlab crea un usuario en el enrutador vrnetlab/VR-netlab9.
Conectándose con ssh:

ubuntu:~$ ssh vrnetlab@172.17.0.2
La autenticidad del host '172.17.0.2 (172.17.0.2)' no se puede establecer.
La huella digital de la clave ECDSA es SHA256:g9Sfg/k5qGBTOX96WiCWyoJJO9FxjzXYspRoDPv+C0Y.
¿Está seguro de que desea continuar conectando (sí/no/[huella digital])? sí
Advertencia: '172.17.0.2' (ECDSA) se ha añadido permanentemente a la lista de hosts conocidos.
Contraseña:
--- JUNOS 20.1R1.11 Kernel de 64 bits  JNPR-11.0-20200219.fb120e7_buil
vrnetlab> show version
Modelo: vmx
Junos: 20.1R1.11

Con esto, la configuración del enrutador ha finalizado.

Las recomendaciones de instalación para enrutadores de diferentes proveedores se pueden encontrar en github del proyecto en los directorios correspondientes.

Parte 5: Postman — conectando el enrutador a OpenDaylight

Instalación de Postman

Para instalar, solo descarga la aplicación desde aquí.

Conectando el enrutador a ODL

Crearemos PUT solicitud:

Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

  1. Cadena de solicitud:
    PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
  2. Cuerpo de la solicitud (pestaña Cuerpo):
    jun01
    172.17.0.2
    22
    vrnetlab
    VR-netlab9
    false
    jun01_cache
  3. En la pestaña Autorización debes establecer el parámetro Basic Auth y el login/contraseña: admin/admin. Esto es necesario para acceder a ODL:
    Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.
  4. En la pestaña Encabezados es necesario agregar dos encabezados:
    • Accept application/xml
    • Content-Type application/xml

Nuestra solicitud está formada. Enviamos. Si todo estaba configurado correctamente, deberíamos recibir el estado "201 Created":

Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

¿Qué hace esta solicitud?

Estamos creando un nodo dentro de ODL con los parámetros del enrutador real, al que queremos acceder.

xmlns="urn:TBD:params:xml:ns:yang:network-topology"
xmlns="urn:opendaylight:netconf-node-topology"

Estos son los espacios de nombres internos XML (espacio de nombres XML) para ODL de acuerdo con los cuales crea el nodo.

Además, el nombre del enrutador es node-id, la dirección del enrutador es host etc.

La línea más interesante es la última. Schema-cache-directory crea un directorio en el que se descargan todos los archivos YANG Schema del enrutador conectado. Puedes encontrarlos en $ODL_ROOT/cache/jun01_cache.

Verificando la conexión del enrutador

Crearemos GET solicitud:

  1. Cadena de solicitud:
    GET http://10.132.1.202:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf/
  2. En la pestaña Autorización debes establecer el parámetro Basic Auth y el login/contraseña: admin/admin.

Enviamos. Deberíamos recibir el estado "200 OK" y una lista de todos los dispositivos soportados. YANG Schema:

Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

Comentario: Para ver la última, en mi caso, tuve que esperar unos 10 minutos después de la ejecución PUT, mientras que todo YANG sсhema se descargue en ODL. Hasta ese momento, al realizar esta GET solicitud se mostrará lo siguiente:

Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

Eliminando el enrutador

Crearemos ELIMINAR solicitud:

  1. Cadena de solicitud:
    DELETE http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
  2. En la pestaña Autorización debes establecer el parámetro Basic Auth y el login/contraseña: admin/admin.

Parte 6: Cambiando la configuración del enrutador

Obteniendo la configuración

Crearemos GET solicitud:

  1. Cadena de solicitud:
    GET http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/
  2. En la pestaña Autorización debes establecer el parámetro Basic Auth y el login/contraseña: admin/admin.

Enviando. Deberíamos recibir el estado "200 OK" y la configuración del enrutador:

Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

Creando la configuración

Como ejemplo, crearemos la siguiente configuración y la modificaremos:

protocols {
    bgp {
        disable;
        shutdown;
    }
}

Crearemos POST solicitud:

  1. Cadena de solicitud:
    POST http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/junos-conf-root:configuration/junos-conf-protocols:protocols
  2. Cuerpo de la solicitud (pestaña Cuerpo):
  3. En la pestaña Autorización debes establecer el parámetro Basic Auth y el login/contraseña: admin/admin.
  4. En la pestaña Encabezados es necesario agregar dos encabezados:
    • Accept application/xml
    • Content-Type application/xml

Después de enviar, deberíamos recibir el estado "204 No Content"

Para verificar que la configuración ha cambiado, se puede usar la solicitud anterior. Pero como ejemplo, vamos a crear otra que nos mostrará solo la información sobre los protocolos configurados en el enrutador.

Crearemos GET solicitud:

  1. Cadena de solicitud:
    GET http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/junos-conf-root:configuration/junos-conf-protocols:protocols
  2. En la pestaña Autorización debes establecer el parámetro Basic Auth y el login/contraseña: admin/admin.

Después de ejecutar la solicitud, veremos lo siguiente:

Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

Cambiando la configuración

Vamos a cambiar la información sobre el protocolo BGP. Después de nuestras acciones, se verá de la siguiente manera:

protocols {
    bgp {
        disable;
    }
}

Crearemos PUT solicitud:

  1. Cadena de solicitud:
    PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/junos-conf-root:configuration/junos-conf-protocols:protocols
  2. Cuerpo de la solicitud (pestaña Cuerpo):
  3. En la pestaña Autorización debes establecer el parámetro Basic Auth y el login/contraseña: admin/admin.
  4. En la pestaña Encabezados es necesario agregar dos encabezados:
    • Accept application/xml
    • Content-Type application/xml

Usando la solicitud anterior, vemos cambios: GET Eliminando la configuración

Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

DELETE http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/junos-conf-root:configuration/junos-conf-protocols:protocols

Crearemos ELIMINAR solicitud:

  1. Cadena de solicitud:
    de la solicitud con información sobre los protocolos veremos lo siguiente:
  2. En la pestaña Autorización debes establecer el parámetro Basic Auth y el login/contraseña: admin/admin.

Al invocar GET Para cambiar la configuración, no es necesario enviar el cuerpo de la solicitud en formato

Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

Adición:

. Esto también se puede hacer en formato XMLPor ejemplo, en la solicitud JSON.

de cambio de configuración, reemplazaremos el cuerpo de la solicitud por: PUT { "junos-conf-protocols:protocols": { "bgp": { "description" : "Cambiado en postman" } } }

No olvides cambiar en la pestaña Headers los encabezados a:

Accept application/json

  • Content-Type application/json
  • Después de enviar, obtendremos el siguiente resultado (Ver la respuesta usando

Después de enviar, obtendremos el siguiente resultado (Ver respuesta usando GET consulta):

Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

Parte 7: agregando Cisco xRV9000

¿Qué pasa con Juniper, sí, sobre Juniper? ¡Hablemos de Cisco!
He encontrado un xRV9000 versión 7.0.2 (una bestia que necesita 8GB de RAM y 4 núcleos. No está disponible públicamente, así que contáctenme en Cisco) — lo ejecutaremos.

Iniciar el contenedor

El proceso de creación de un contenedor Docker no difiere prácticamente del de Juniper. De manera similar, colocamos el archivo .qcow2 con el enrutador en el directorio que corresponde a su nombre, (en este caso xrv9k) y ejecutamos el comando make docker-image.

Después de unos minutos vemos que la imagen se ha creado:

ubuntu:~$ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
vrnetlab/vr-xrv9k   7.0.2               54debc7973fc        hace 4 horas        1.7GB
vrnetlab/vr-vmx     20.1R1.11           b1b2369b453c        hace 4 semanas      4.43GB
debian              stretch             614bb74b620e        hace 7 semanas      101MB

Procedemos a iniciar el contenedor:

ubuntu:~$ sudo docker run -d --privileged --name xrv01 54debc7973fc

Después de un tiempo verificamos que el contenedor se inició:

ubuntu:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                 PORTS                                                      NAMES
058c5ecddae3        54debc7973fc        "\/launch.py"        hace 4 horas       Arriba 4 horas (saludable)   22\/tcp, 830\/tcp, 5000-5003\/tcp, 10000-10099\/tcp, 161\/udp   xrv01

Conectamos a través de ssh:

ubuntu@ubuntu:~$ ssh vrnetlab@172.17.0.2
Contraseña:

RP\/0\/RP0\/CPU0:ios#show version
Lun Jul  6 12:19:28.036 UTC
Cisco IOS XR Software, Version 7.0.2
Copyright (c) 2013-2020 by Cisco Systems, Inc.

Información de construcción:
 Construido por     : ahoang
 Construido el     : Vie Mar 13 22:27:54 PDT 2020
 Anfitrión de construcción   : iox-ucs-029
 Área de trabajo    : \/auto\/srcarchive15\/prod\/7.0.2\/xrv9k\/ws
 Versión      : 7.0.2
 Ubicación     : \/opt\/cisco\/XR\/packages\
 Label        : 7.0.2

cisco IOS-XRv 9000 () procesador
El tiempo de actividad del sistema es 3 horas 22 minutos

Conectamos el enrutador a OpenDaylight

La adición se realiza de manera muy similar a la imagen vMX. Solo hay que cambiar los nombres.
PUT solicitud:
Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

Después de un tiempo, llamamos GET consulta, para verificar que todo esté conectado:
Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

Cambiando la configuración

Configuraremos la siguiente configuración:

!
enrutador ospf LAB
 mpls ldp auto-config
!

Crearemos POST solicitud:

  1. Cadena de solicitud:
    POST http:\/\/10.132.1.202:8181\/restconf\/config\/network-topology:network-topology\/topology\/topology-netconf\/node\/xrv01\/yang-ext:mount\/Cisco-IOS-XR-ipv4-ospf-cfg:ospf
  2. Cuerpo de la solicitud (pestaña Cuerpo):
    {
        "processes": {
            "process": [
                {
                    "process-name": "LAB",
                    "default-vrf": {
                        "process-scope": {
                            "ldp-auto-config": [
                                null
                            ]
                        }
                    }
                }
            ]
        }
    }
  3. En la pestaña Autorización debes establecer el parámetro Basic Auth y el login/contraseña: admin/admin.
  4. En la pestaña Encabezados es necesario agregar dos encabezados:
    • Content-Type application/json
    • Después de enviar, obtendremos el siguiente resultado (Ver la respuesta usando

Después de su ejecución, deberíamos obtener el estado "204 No Content".

Verificamos qué obtuvimos.
Para esto crearemos GET solicitud:

  1. Cadena de solicitud:
    GET http:\/\/10.132.1.202:8181\/restconf\/config\/network-topology:network-topology\/topology\/topology-netconf\/node\/xrv01\/yang-ext:mount\/Cisco-IOS-XR-ipv4-ospf-cfg:ospf
  2. En la pestaña Autorización debes establecer el parámetro Basic Auth y el login/contraseña: admin/admin.

Después de ejecutar, deberíamos ver lo siguiente:

Automatización de servicios de red o cómo construir un laboratorio virtual con OpenDaylight, Postman y Vrnetlab.

Para eliminar la configuración utilizamos ELIMINAR:

  1. Cadena de solicitud:
    ELIMINAR http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/xrv01/yang-ext:mount/Cisco-IOS-XR-ipv4-ospf-cfg:ospf
  2. En la pestaña Autorización debes establecer el parámetro Basic Auth y el login/contraseña: admin/admin.

Conclusión

Como habrán notado, los procedimientos para conectar dispositivos Cisco y Juniper a OpenDaylight son bastante similares, lo que abre un amplio campo para la creatividad. Desde la gestión de configuraciones de todos los componentes de la red hasta la creación de políticas de red personalizadas.
En este tutorial, he presentado ejemplos sencillos de cómo interactuar con el hardware de red utilizando OpenDaylight. Sin duda, las solicitudes de los ejemplos presentados pueden ser mucho más complejas, permitiendo configurar servicios enteros con un solo clic; todo está limitado únicamente por su imaginación.

Continuará...

P.D.

Si ya conoces todo esto o, por el contrario, has pasado y te ha encantado ODL, te recomiendo que mires hacia el desarrollo de aplicaciones en el controlador ODL. Puedes comenzar. desde aquí.

¡Éxitos en tus experimentos!

Lista de literatura

  1. Vrnetlab: Emula redes utilizando KVM y Docker / Brian Linkletter
  2. Cookbook de OpenDaylight / Mathieu Lemay, Alexis de Talhouet, Et al
  3. Programabilidad de Redes con YANG / Benoît Claise, Loe Clarke, Jan Lindblad
  4. Aprendiendo XML, Segunda Edición / Erik T. Ray
  5. DevOps Efectivo / Jennifer Davis, Ryn Daniels

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster