Python

5 Napalm

Pour certains constructeurs, la librairie complémentaire NAPALM (Network Automation and Programmability Abstraction Layer with Multivendor support) peut fournir des fonctions plus abouties, en utilisant également Netmiko et Paramiko, pour gérer la configuration des équipements. Alors que la majorité des constructeurs ont des discours orientés automatisation, on peut déplorer de ne retrouver toujours que les mêmes, présents dans la simulation chère à l’intégration continue et dans les librairies Python.

Par exemple, pour des équipements Cisco IOS, cette bibliothèque permet d’automatiser les actions suivantes :

  • Replace : remplacer l’ensemble de la configuration en cours d’exécution par une configuration complètement nouvelle.
  • Merge : fusionner un ensemble de modifications contenues dans un fichier avec la configuration en cours d’exécution.
  • Compare : comparer le contenu du nouveau fichier de configuration proposé avec la configuration en cours d’exécution. Cela s’applique uniquement aux opérations de remplacement de configuration, et non aux opérations de fusion.
  • Commit : déployer la configuration mise au point. Cela peut être soit un tout nouveau fichier (pour les opérations de remplacement), soit un fichier de fusion.
  • Discard : revenir à la configuration running-config actuelle. Réinitialiser à vide le fichier de configuration de fusion.
  • Rollback : ramener la configuration en cours d’exécution à un fichier qui a été enregistré avant le commit précédent.

Une matrice de compatibilité permet de savoir sur quels constructeurs, les fonctions proposées sont supportées. Un des avantages est de pouvoir écrire des scripts qui effectuent une même tâche sur plusieurs types d’équipements différents sans avoir à prendre en compte les spécificités de chacun des systèmes. Avec quelques lignes en Python, il est possible de simuler le comportement idempotent d’Ansible, comme dans l’exemple si délicat des ACLs présenté ci-dessous. L’accès SSH sur le Catalyst Cisco nécessite la configuration « aaa » appropriée et l’accès SCP, pour envoyer le fichier acl.cfg, nécessite la validation des commandes « ip scp server enable » et « aaa authorization exec default local ».

Fichier acl.cfg

access-list 101 permit icmp any any
access-list 101 permit tcp any any eq 22
access-list 101 permit tcp any any eq telnet
end

Fichier ios_acl.py

#!/usr/bin/env python
from napalm import get_network_driver
 
devices = ['192.168.2.10', '192.168.2.11']
 
for device in devices:
  print ("Connect to device " + str(device))
  driver = get_network_driver('ios')
  catalyst = driver(device, 'user', 'pass')
  catalyst.open()
  catalyst.load_merge_candidate(filename='acl.cfg')
  diffs = catalyst.compare_config()
  if len(diffs) > 0:
    print(diffs)
    catalyst.commit_config()
  else:
    print('No ACL changes required on this device.')
    catalyst.discard_config()
  catalyst.close()

Cette librairie peut être utilisée depuis l’interpréteur Python, de façon programmatique depuis un script Python ou intégrée dans un outil d’automatisation comme Ansible.

L’utilisation de la librairie NAPALM pour effectuer des validations, tant recommandées dans l’approche Agile, revient à écrire un script en langage YAML (Yet Another Markup Language) et l’utiliser en spécifiant quels drivers matériels doivent être pris en compte et les informations de configurations attendues sur les équipements. Des exemples de fichiers YAML sont disponibles dans la documentation [5] au chapitre « Writing validators ».

Fichier validations.yml

---
- get_facts:
    os_version: vios_l2 Software
    hostname: vIOS-L2-01
    interface_list:
      _mode: strict
      list:
        - GigabitEthernet0/0
        - Vlan1

- get_interfaces_ip:
    Vlan1:
      ipv4:
        192.168.122.10:
          prefix_length: 24
        _mode: strict

- get_environment:
    memory:
      used_ram: '<80000000'

- ping:
    _name: ping_automation
    _kwargs:
      destination: 192.168.122.209
      source: 192.168.122.10
    success:
      packet_loss: 0
    _mode: strict

Fichier ios_validations.py

#!/usr/bin/env python
from napalm import get_network_driver
import pprint

ios_driver = get_network_driver("ios")
ios_config = {
    "hostname": "192.168.122.10",
    "username": "admin",
    "password": "cisco",
}

with ios_driver(**ios_config) as ios:
  pprint.pprint(ios.compliance_report("validations.yml"))

Résultat

{u'complies': True,
 'get_environment': {u'complies': True,
                     u'extra': [],
                     u'missing': [],
                     u'present': {'memory': {u'complies': True,
                                             u'nested': True}}},
 'get_facts': {u'complies': True,
               u'extra': [],
               u'missing': [],
               u'present': {'hostname': {u'complies': True,
                                         u'nested': False},
                            'interface_list': {u'complies': True,
                                               u'nested': True},
                            'os_version': {u'complies': True,
                                           u'nested': False}}},
 'get_interfaces_ip': {u'complies': True,
                       u'extra': [],
                       u'missing': [],
                       u'present': {'Vlan1': {u'complies': True,
                                              u'nested': True}}},
 'ping_automation': {u'complies': True,
                     u'extra': [],
                     u'missing': [],
                     u'present': {'success': {u'complies': True,
                                              u'nested': True}}},
 u'skipped': []}

De même, il est possible d’utiliser la librairie napalm-yang pour transformer les données de configuration en YANG et vice-versa. On sent progressivement le rapprochement entre les concepts utilisés pour la programmation de scripts réseau et les choix qui ont été faits dans l’environnement Ansible.