JSNAPy

Dernière modification le 19 août 2019

JSNAPy est un outil Open Source mis à disposition par Juniper. Il permet de valider la configuration d’un équipement et de comparer l’état d’une configuration avant et après une modification.

Architecture de la librairie Juniper JSNAPy

L’action peut être réalisée sur la configuration actuelle (snapcheck) ou sur le couple de configurations « avant et après » (PRE et POST).

Cet outil possède sa propre interface CLI pour être utilisé de façon autonome. Il est également possible de faire fonctionner JSNAPy à partir du modules Ansible galaxy juniper_junos_jsnapy ou directement à partir de scripts Python.

jsnapy --snapcheck postinstall -f start-2-1.yml
hosts:
  - device: localhost
    username: root
    passwd: Juniper
    port: 2222
tests:
  - test_interfaces.yml
tests_include:
  - test_interfaces_terse

test_interfaces_terse:
  - rpc: get-interface-information
  - item:
      id: ./name
      xpath: //physical-interface[normalize-space(name) = "em0"]
      tests:
        - is-equal: oper-status, up
          info: "Test Succeeded! oper-status is {{pre['oper-status']}} for interface {{id_0}}"
          err: "Test Failed! oper-status is {{post['oper-status']}} for interface {{id_0}}"
#!/usr/bin/env python3

import sys
from jnpr.jsnapy import SnapAdmin
from jnpr.junos import Device
from jnpr.junos.exception import ConnectError

# Variable for the Call to SnapAdmin
js = SnapAdmin()

# Config file to load
config_file = "start-2-1.yml"

# Call jsnapy With the Defined Configuration File
try:
  snapchk = js.snapcheck(config_file, "snap")
except ConnectError as err:
  print (
    'Cannot connect to device: {0}'
    .format(err)
  )
  sys.exit(1)
except Exception as err:
  print (err)
  sys.exit(1)
# Print results
for val in snapchk:
  print ('Tested on: {0}'.format(val.device))
  print (
    'Message: {0}'
    .format(
      val.test_details['get-interface-information'][0]['passed'][0]['message']
    )
  )
  print ('Final result: {0}'.format(val.result))
  print ('Total passed: {0}'.format(val.no_passed))
  print ('Total failed: {0}'.format(val.no_failed))
jsnapy --snap pre -f start-2-2.yml
jsnapy --snap post -f start-2-2.yml
jsnapy --check pre post -f start-2-2.yml
hosts:
  - device: localhost
    username: root
    passwd: Juniper
    port: 2222
tests:
  - test_no_diff.yml
tests_include:
  - test_interfaces_terse

test_interfaces_terse:
  - rpc: get-interface-information
  - iterate:
      xpath: //physical-interface
      id: './name'
      tests:
        - no-diff: description
          err: "Test Failed! description for <{{id_0}}> got changed, before it was <{{pre['description']}}>, now it is <{{post['description']}}>"
          info: "Test succeeded! description for <{{id_0}}> did not change, before it was <{{pre['description']}}>, now it is <{{post['description']}}>"

J’ai demandé une amélioration car le nom des fichiers snapshots est constitué avec l’adresse IP mais pas avec le port, et il n’est pas possible de changer le nom du fichier depuis un playbook Ansible utilisant juniper_junos_jsnappy. Lorsque JSNAPy est utilisé en environnement de simulation Vagrant, tous les devices ont la même adresse IP, ce n’est que le port qui les différencient. A suivre…