TP 9 : Cisco IOS-XE – Modélisation YANG et RESTCONF

Module : 3 – Standards industriels (YANG) et approche Cloud/SDN Durée indicative : 2h Prérequis : partie théorique du Module 3, un routeur virtuel Cisco IOS-XE (CSR1000v ou Catalyst 8000V) accessible, Python 3, pip install requests

Objectifs

  • Explorer les modèles de données YANG exposés par un équipement Cisco IOS-XE.
  • Lire et modifier une configuration (OSPF, interfaces loopback) via RESTCONF.
  • Manipuler des URLs RESTCONF correspondant à des ressources YANG.

Contexte

Vous automatisez la configuration d’un routeur d’accès Cisco à l’aide de RESTCONF, en remplacement des commandes CLI classiques.

Cycle de vie de la ressource Loopback100 via RESTCONF Cycle de vie de la ressource Loopback100 via RESTCONF POST → GET → PATCH → DELETE : le fil rouge des étapes 3 à 6 de ce TP, avec le code HTTP attendu à chaque appel.

Étape 1 – Activation de RESTCONF

Sur le routeur (console ou SSH) :

configure terminal
restconf
ip http secure-server
username api-user privilege 15 secret VotreMotDePasse
end

Étape 2 – Découverte des capacités

curl -k -u api-user:VotreMotDePasse \
  -H "Accept: application/yang-data+json" \
  https://192.168.1.1/restconf/data/ietf-yang-library:yang-library

Identifiez dans la réponse quelques modules disponibles (ietf-interfaces, Cisco-IOS-XE-native, openconfig-interfaces si présent).

Étape 3 – Lecture des interfaces (GET)

import requests

BASE = "https://192.168.1.1/restconf/data"
AUTH = ("api-user", "VotreMotDePasse")
HEADERS = {"Accept": "application/yang-data+json"}

resp = requests.get(f"{BASE}/ietf-interfaces:interfaces", auth=AUTH, headers=HEADERS, verify=False)
resp.raise_for_status()
print(resp.json())

Étape 4 – Création d’une interface loopback

payload = {
    "ietf-interfaces:interface": {
        "name": "Loopback100",
        "type": "iana-if-type:softwareLoopback",
        "enabled": True,
        "ietf-ip:ipv4": {
            "address": [{"ip": "10.100.100.1", "netmask": "255.255.255.255"}]
        }
    }
}
headers = {"Content-Type": "application/yang-data+json"}
resp = requests.post(f"{BASE}/ietf-interfaces:interfaces", json=payload, auth=AUTH, headers=headers, verify=False)
resp.raise_for_status()

Vérifiez sur le routeur avec show ip interface brief.

Étape 5 – Configuration OSPF via le modèle natif Cisco

Utilisez le modèle Cisco-IOS-XE-ospf pour créer un processus OSPF annonçant le réseau de la loopback :

ospf_payload = {
    "Cisco-IOS-XE-ospf:ospf": [
        {
            "id": 1,
            "network": [
                {"ip": "10.100.100.0", "mask": "0.0.0.255", "area": 0}
            ]
        }
    ]
}
resp = requests.post(f"{BASE}/Cisco-IOS-XE-native:native/router/Cisco-IOS-XE-ospf:router-ospf",
                      json=ospf_payload, auth=AUTH, headers=headers, verify=False)
resp.raise_for_status()

Vérifiez avec show ip ospf neighbor / show running-config | section ospf.

Étape 6 – Modification et suppression (PATCH/DELETE)

  • Modifiez l’adresse de la loopback avec une requête PATCH sur l’URL de l’interface.
  • Supprimez l’interface Loopback100 avec DELETE.

Rendu attendu

  • Scripts Python versionnés dans un dépôt Git.
  • Une capture show running-config avant/après montrant les changements appliqués.
  • Un court résumé des modules YANG explorés à l’étape 2.

Points de vérification

  • La loopback est créée puis supprimée avec succès via RESTCONF.
  • Le processus OSPF apparaît dans show ip ospf après configuration.
  • Chaque requête vérifie le code de statut HTTP retourné.