Delta de configuration incorrect sur Cisco IOS XR

Vincent Bernat

En bref

Ne faites jamais confiance à show commit changes diff sur Cisco IOS XR.

Cisco IOS XR est le système d’exploitation utilisé par les routeurs Cisco ASR, NCS et 8000. Par rapport à Cisco IOS, il présente une configuration cible et une configuration courante. En mode configuration, vous pouvez modifier la première et émettre la commande commit pour l’appliquer1. Il s’agit d’un concept commun à de nombreux NOS.

Avant d’activer la configuration candidate, vous pouvez vérifier les changements qui ont été accumulés jusqu’à présent avec la commande show commit changes diff2. Son but est de montrer la différence entre la configuration courante (show running-configuration) et la configuration cible (show configuration merge). Est-ce si difficile ?

Désactivons une interface sur IOS XR 7.6.2 (publié en août 2022) :

RP/0/RP0/CPU0:router(config)#int Hu0/1/0/1 shut
RP/0/RP0/CPU0:router(config)#show commit changes diff
Wed Nov 23 11:08:30.275 CET
Building configuration...
!! IOS XR Configuration 7.6.2
+  interface HundredGigE0/1/0/1
+   shutdown
   !
end

Le signe + précédant interface HundredGigE0/1/0/1 semble indiquer que nous avons créé une interface. Peut-être avons-nous faire une erreur de frappe ? Non. Si vous regardez la configuration cible, tout est correct :

RP/0/RP0/CPU0:router(config)#show configuration merge int Hu0/1/0/1
Wed Nov 23 11:08:43.360 CET
interface HundredGigE0/1/0/1
 description PNI: (some description)
 bundle id 4000 mode active
 lldp
  receive disable
  transmit disable
 !
 shutdown
 load-interval 30

Voici un exemple plus problématique sur IOS XR 7.2.2 (publié en janvier 2021). Nous cherchons à déconfigurer trois interfaces :

RP/0/RP0/CPU0:router(config)#no int GigabitEthernet 0/0/0/5
RP/0/RP0/CPU0:router(config)#int TenGigE 0/0/0/5 shut
RP/0/RP0/CPU0:router(config)#no int TenGigE 0/0/0/28
RP/0/RP0/CPU0:router(config)#int TenGigE 0/0/0/28 shut
RP/0/RP0/CPU0:router(config)#no int TenGigE 0/0/0/29
RP/0/RP0/CPU0:router(config)#int TenGigE 0/0/0/29 shut
RP/0/RP0/CPU0:router(config)#show commit changes diff
Mon Nov  7 15:07:22.990 CET
Building configuration...
!! IOS XR Configuration 7.2.2
-  interface GigabitEthernet0/0/0/5
-   shutdown
   !
+  interface TenGigE0/0/0/5
+   shutdown
   !
   interface TenGigE0/0/0/28
-   description Trunk (some description)
-   bundle id 2 mode active
   !
end

Les deux premières commandes sont correctement représentées par les deux premiers morceaux du delta de configuration : nous retirons l’interface GigabitEthernet0/0/0/5 et créons TenGigE0/0/0/5. Les deux commandes suivantes sont également correctement traduites. L’interface TenGigE0/0/0/28 est déjà désactivée et seules les directives description et bundle id sont à retirer. Toutefois, la commande diff ne montre aucune modification pour TenGigE0/0/0/29. Le delta concernant cette interface devrait être identique à celui pour TenGigE0/0/0/28.

RP/0/RP0/CPU0:router(config)#show run int TenGigE 0/0/0/29
Mon Nov  7 15:07:43.571 CET
interface TenGigE0/0/0/29
 description Trunk to other router
 bundle id 2 mode active
 shutdown
!
RP/0/RP0/CPU0:router(config)#show configuration merge int TenGigE 0/0/0/29
Mon Nov  7 15:07:53.584 CET
interface TenGigE0/0/0/29
 shutdown
!

Comment peut-on obtenir un résultat correct pour TenGigE0/0/0/28 mais incorrect pour TenGigE0/0/0/29 alors qu’ils partagent la même configuration ? Comment peut-on faire confiance à la commande diff si elle oublie une partie de la configuration ?

Si vous utilisez des outils d’automatisation, vérifiez s’ils construisent le delta à l’aide des sorties des commandes show running-config et show configuration merge. C’est le cas de NAPALM mais pas de la collection cisco.iosxr pour Ansible.

Le problème n’est pas limité aux directives interface. Il est possible d’obtenir des résultats similaires à d’autres endroits. Par exemple, voici ce qui se produit quand on retire des voisins BGP avec IOS XR 7.2.2:

RP/0/RP0/CPU0:router(config)#router bgp 65400
RP/0/RP0/CPU0:router(config-bgp)#vrf public
RP/0/RP0/CPU0:router(config-bgp-vrf)#no neighbor 217.29.66.1
RP/0/RP0/CPU0:router(config-bgp-vrf)#no neighbor 217.29.66.75
RP/0/RP0/CPU0:router(config-bgp-vrf)#no neighbor 217.29.66.110
RP/0/RP0/CPU0:router(config-bgp-vrf)#no neighbor 217.29.66.112
RP/0/RP0/CPU0:router(config-bgp-vrf)#no neighbor 217.29.66.158
RP/0/RP0/CPU0:router(config-bgp-vrf)#show commit changes diff
Tue Aug  2 13:58:02.536 CEST
Building configuration...
!! IOS XR Configuration 7.2.2
   router bgp 65400
    vrf public
-    neighbor 217.29.66.1
-     remote-as 16004
-     use neighbor-group MIX_IPV4_PUBLIC
-     description MIX: MIX-IT
     !
-    neighbor 217.29.66.75
-     remote-as 49367
-     use neighbor-group MIX_IPV4_PUBLIC
     !
-    neighbor 217.29.67.10
-     remote-as 19679
     !
-    neighbor 217.29.67.15
-    neighbor 217.29.66.112
-     remote-as 8075
-     use neighbor-group MIX_IPV4_PUBLIC
-     description MIX: Microsoft
-     address-family ipv4 unicast
-      maximum-prefix 1500 95 restart 5
      !
     !
-    neighbor 217.29.66.158
-     remote-as 24482
-     use neighbor-group MIX_IPV4_PUBLIC
-     description MIX: SG.GS
-     address-family ipv4 unicast
     !
     !
    !
   !
end

Le seul morceau correct est celui pour 217.29.66.112. Dans tous les autres cas, il manque certaines des lignes supprimées. Pour 217.29.67.15, il manque même toutes les lignes ! Quelle est la qualité du code qui fournit une telle différence ?

Je pourrais continuer longtemps avec des exemples comme ceux-ci. Le TAC Cisco est disposé à ouvrir un rapport dans le DDTS, leur système de suivi des bogues, pour corriger des occurrences spécifiques de ce problème3. Cependant, je ne comprends pas pourquoi l’équipe XR ne fournit pas simplement la différence entre show run et show configuration merge. La sortie serait toujours correcte ! 🙄


  1. IOS XR a plusieurs limitations. La plus gênante est l’impossibilité de modifier le numéro d’AS dans la directive router bgp. Une telle limitation est très pénible pour les opérations et l’automatisation. ↩︎

  2. Cette commande aurait juste pu être show commit, car show commit changes diff est la seule commande valide que vous pouvez exécuter à partir de ce point. A partir de IOS XR 7.5.1, show commit changes diff precise est également une commande valide. Cependant, je n’ai pas trouvé de documentation à son sujet et elle semble fournir la même sortie que show commit changes diff. C’est dire à quel point IOS XR peut être bancal. ↩︎

  3. Regardez par exemple CSCwa26251 qui correspond à un problème que j’ai remonté plus tôt cette année. Il est nécessaire d’avoir un contrat de support avec Cisco pour voir son contenu. ↩︎