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.
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…