Εισαγωγή

Το PyATS είναι ένα software framework για την κατασκευή αυτόματων διαδικασιών ελέγχου για δικτυακές συσκευές, ή όπως λέει η Cisco, ένα ολοκληρωμένο οικοσύστημα αυτοματισμού και δοκιμών, προσφέροντας όλα τα εργαλεία για τις καθημερινές DevOps εργασίες των μηχανικών δικτύων, δίνοντας εργαλεία είτε για τη γραμμή εντολών, είτε με τη χρήση libraries, είτε μέσω ενός σύγχρονου GUI Dashboard.

Είναι εσωτερικό εργαλείο της Cisco εδώ και 10 χρόνια (2012) για την δοκιμή των προϊόντων και συστημάτων τους, το οποίο αποφάσισαν να διαθέσουν στο ευρύ κοινό από το 2017. Είναι φτιαγμένο σε Python και αποτελείται από διάφορα layers, τα οποία μπορούν να λειτουργούν είτε σε συνδυασμό είτε ανεξάρτητα.

Στο παρόν post θα εξηγήσουμε σύντομα τί είναι το PyATS και από τί αποτελείται, ποιοι είναι οι βασικοί τρόποι χρήσης του και θα σας δώσουμε κατευθύνσεις για το που μπορείτε να μάθετε περισσότερα. Το πρώτο που πρέπει να αναφέρουμε, είναι: προσοχή πως θα το προφέρετε: PyATS Pronounciation

Δεν μπορώ όμως να σκεφτώ καλύτερη εισαγωγή από την παρουσίαση του μέχρι πρότινος PyATS team leader, Siming Yuan: Network Assurance: pyATS / Genie for Network Engineers

Εδώ σχετικό post του στο Cisco Developer Blog - https://blogs.cisco.com/developer/pyats-genie-transform

Κι εδώ το Getting Started από το Devnet Documentation - https://developer.cisco.com/docs/pyats-getting-started/

Η ομάδα του Cisco PyATS αποτελείται από εξαιρετικούς μηχανικούς οι οποίοι είναι πάντα πρόθυμοι να προσφέρουν βοήθεια αρκεί να τους στείλετε ένα email στο pyats-support-ext@cisco.com Επίσης, μπορείτε να κάνετε join στο σχετικό webex channel εδώ: https://eurl.io/#r18UzrQVr ή να το βρείτε από τη λίστα εδώ: https://eurl.io/

Framework Layers

Όπως αναφέραμε το PyATS αποτελείται από πολλά κομμάτια τα οποία μπορείτε να θεωρήσετε πως λειτουργούν σε ανεξάρτητα στρώματα, όπως παρακάτω: PyATS Layers

Τα βασικά layers λοιπόν είναι:

  • PyATS Core Toolbox
  • PyATS SDK (π.χ. Genie)
  • Business Logic Tools

Μπορείτε να χρησιμοποιήσετε μόνο το core toolbox, ή τα libraries ή όλα μαζί με το business logic, είτε από τη γραμμή εντολής (Genie CLI), είτε μέσω CI/CD pipelines είτε φτιάχνοντας τη δική σας business logic ενσωματώνοντας όλα σε python scripts.

Πως να το εγκαταστήσετε:

To PyATS είναι διαθέσιμο:

Μπορείτε να τρέξετε το python package σε Linux & Mac αλλά όχι σε Windows. Αν θέλετε να τρέξετε το PyATS σε Windows, θα πρέπει να χρησιμοποιήσετε το WSL (Windows Subsystem for Linux) ή να το τρέξετε μέσω Docker (τότε όμως στην ουσία δεν το τρέχετε σε Windows).

PyATS Features

Γενικά

Τα features του PyATS είναι πραγματικά ατελείωτα. Αξίζει να επενδύσει κανείς χρόνο για να τα εντάξει ως “βέλη” στη “φαρέτρα” του.

Platform Agnostic Models

Οι μηχανικοί του PyATS έχουν κατασκευάσει μοντέλα δεδομένων για τις δικτυακές συσκευές που δεν είναι δεμένα με συγκεκριμενους κατασκευαστές και μοντέλα και μόνο. Π.χ. το ospf routing model δεν είναι ειδικά για Cisco ή Juniper κλπ. Έτσι μπορείτε να χρησιμοποιήσετε το PyATS με εξοπλισμό που δεν είναι cisco, ακόμα και linux hosts.

Ωστόσο για να μπορέσετε να κάνετε interface με τις συσκευές και να αλληλεπιδράσετε μαζί τους και με τα μοντέλα, χρειάζεται να υπάρχει και το ενδιάμεσο layer που μιλάει με τις συσκευές. Αυτό πρέπει είτε να είναι ήδη διαθέσιμο (parse, learn, config) ή μπορείτε να το κατασκευάσετε!

Device connection

To PyATS χρησιμοποιεί το Unicon library (https://developer.cisco.com/docs/unicon/) για να “μιλήσει” με τις συσκευές μέσω SSH & Telnet. Μπορείτε να καθορίσετε τις παραμέτρους σύνδεσης ανάλογα με το τί υποστηρίζεται από τις συσκευές.

Η σύνδεση προς τις συσκευές γίνεται σειριακά, αλλά μπορεί να γίνει και παράλληλα υπό προϋποθέσεις (pyats pcall - https://pubhub.devnetcloud.com/media/pyats/docs/async/pcall.html) για γρηγορότερη εκτέλεση και λήψη αποτελεσμάτων.

Device Inventory - Testbed

Το PyATS χρησιμοποιεί μια δομή που ονομάζει testbed για την καταχώρηση των συσκευών, η οποία εφόσον φορτωθεί από αρχείο, πρέπει να είναι YAML αρχείο (.yml) με συγκεκριμένη δομή https://pubhub.devnetcloud.com/media/pyats/docs/topology/creation.html

PyATS Testbed Yaml

Εναλλακτικά μπορείτε είτε να παράγετε το testbed μόνο απαντώντας με ερωτήσεις στο cli ή από ένα αρχείο excel ή ακόμα και δυναμικά στη μνήμη μέσω python. Υπάρχουν κι άλλες δυνατότητες εισάγοντας δεδομένα από άλλα εργαλεία ή frameworks.

Δείτε ένα παράδειγμα κατασκευής pyats testbed σε αρχείο διαβάζοντας δεδομένα από το Cisco Prime Infrastructure εδώ: https://github.com/itheodoridis/itheodoridis-createtestbedsfromPI

Φυσικά ένα testbed είναι κάτι περισσότερο από ένα κατάλογο συσκευών. Μπορεί να ορίζει ένα πλήρες network topology:

Genie CLI vs Python Library

Μπορείτε να εκτελέσετε τις λειτουργίες που υποστηρίζει το PyATS είτε μέσω CLI (περιορισμένες λειτουργίες, π.χ. genie parse, genie learn, genie diff) είτε μέσω python, όπου μπορείτε να σχηματίσετε τη δική σας λογική και να ελέγξετε απόλυτα την εισαγωγή και εξαγωγή δεδομένων.

Στην περίπτωση χρήσης του Genie CLI, τα αποτελέσματα αποθηκεύονται ως αρχεία κειμένου στο δίσκο σε ξεχωριστά directories (ορίζονται κατά την εκτέλεση).

Μπορείτε να χρησιμοποιήσετε το ίδιο directory εκτελώντας πολλαπλές λειτουργίες για όλα τα devices, όπου θα αποθηκεύονται δύο αρχεία ανά συσκευή και λειτουργία, ένα δομημένο και ένα με την raw μορφή που θα τα παίρνατε από τη γραμμή εντολής αν είχατε συνδεθεί οι ίδιοι στη συσκευή και είχατε εκτελέσει τις συγκεκριμένες λειτουργίες.

Genie Parse & Parsers

Με το Genie μπορείτε να εκτελέσετε εντολές συλλογής δεδομένων στις δικτυακές συσκευές (π.χ. Cisco show commands) και να επεξεργαστείτε τα δεδεμένα που επιστρέφονται, ώστε να προκύψουν συγκεκριμένες δομές που μπορείτε να αξιοποιήσετε για να παράγετε αυτοματοποιημένη λογική ή να τα επεξεργαστείτε περαιτέρω.

Οι Genie parsers ερμηνεύουν αυτά τα δεδομένα και απομονώνουν τα πεδία δεδομένων σε αυτά, ενώ τα επιστρέφουν πίσω σε δομημένη μορφή (multi-level dictionaries, αν χρησιμοποιείτε python).

# using Python
bash$ pyats shell --testbed-file testbed.yaml
>>> testbed.devices['nx-osv-1'].connect()
>>> output = testbed.devices['nx-osv-1'].parse('show interfaces')
# using CLI 
bash$ pyats parse "show interfaces" --testbed-file testbed.yaml

Python Parsing with pyATS | Genie - Cisco Automation Made Easy

Μπορείτε να δείτε ποιοι είναι διαθέσιμοι parsers μέχρι στιγμής στο παρακάτω link: https://pubhub.devnetcloud.com/media/genie-feature-browser/docs/#/parsers

Μπορείτε επίσης να κατασκευάσετε τους δικούς σας, δείτε τα παρακάτω δύο videos:

How to write a Genie parser

Creating a pyATS Genie Parser from SCRATCH

Μπορείτε βέβαια να ακολουθήσετε και το επίσημο documentation που περιέχει αρκετά στοιχεία σε γραπτή μορφή για το πως να μάθετε να το κάνετε: https://pubhub.devnetcloud.com/media/pyats-development-guide/docs/writeparser/writeparser.html

Genie Learn & Models

Eίτε εκτελείτε το genie learn μέσω cli, είτε μαζεύετε τα στοιχεία μέσω python, στην ουσία συλλέγετε δεδομένα αντίστοιχα με τα μοντέλα που έχει κατασκευάσει η ομάδα του PyATS. Πρακτικά είναι σαν να τρέχετε πολλές εντολές μαζί, οι οποίες συμπληρώνουν την εικόνα.

Μπορείτε να δείτε τα διαθέσιμα μοντέλα στο link https://pubhub.devnetcloud.com/media/genie-feature-browser/docs/#/models

Genie Conf

Μπορείτε να δώσετε εντολές ρυθμίσεων προς συσκευές με το PyATS (αντίστοιχα με τα Cisco configuration commands). Αυτό έχει μεγαλύτερο νόημα μέσω Python. Μπορείτε αυτό να το κάνετε είτε αυτόνομα για να περάσετε configuration στις συσκευές με δομημένο τρόπο ή ακόμα και να κάνετε μικρές αλλαγές στο δίκτυο ώστε να προκαλέσετε μικρά failures και να ελέγξετε πως ανταποκρίνεται στα πλαίσια PyATS triggers/test cases.

Genie Conf Documentation

Genie Diff

Είτε έχετε εκτελέσει εντολές Genie Parse/Learn μέσω CLI είτε μέσω Python, μπορείτε να χρησιμοποιήσετε το PyATS για να εντοπίσετε διαφορές μεταξύ δύο διαφορετικών καταστάσεων του δικτύου. Π.χ. πριν και μετά από μια μεγάλη αλλαγή. Στην περίπτωση αυτή το PyATS επεξεργάζεται τα δεδομένα με αστραπιαία ταχύτητα και παράγει τα αποτελέσματα εντοπίζοντας και την παραμικρή διαφορά, είτε είναι κάτι που αναμένατε είτε όχι. Προφανώς αυτό εξαρτάται από τις εντολές που επιλέξατε να τρέξετε (parse) ή τα μοντέλα που επιλέξατε να μάθετε (learn).

Genie Diff

Το εξαιρετικό genie diff βρίσκει όλες τις διαφορές μεταξύ των αντίστοιχων outputs στα δύο directories που αντιστοιχούν στις δύο καταστάσεις για το πριν και το μετά και δέχεται ότι εξαιρέσεις θέλει κανείς, π.χ. αν δεν ενδιαφέρουν interface counters για packets, bytes, κλπ.

Genie Diff Output

Αν θέλετε να δείτε το σχετικό documentation για CLI δείτε εδώ: https://pubhub.devnetcloud.com/media/genie-docs/docs/cli/genie_diff.html

Αν θέλετε να διαβάσετε για μια περίπτωση χρήσης αυτού και μόνο του feature (CLI/Python) μπορείτε να διαβάσετε το παρακάτω άρθρο ή να ρίξετε μια ματιά στο παρακάτω git repo.

Testing (Cases)

Αυτό είναι ίσως το πιο ουσιαστικό κομμάτι της χρήσης του PyATS, παρότι κανείς δεν μπορεί να σας πει τί μπορεί να είναι χρήσιμο για σας από ένα εργαλείο.

Μπορείτε να ορίσετε σετ από δοκιμές που που πρέπει να γίνουν ορίζοντας ένα σενάριο, είτε για μεμονωμένες συσκευές είτε για ολόκληρο το δίκτυο (testbed), ώστε να δώσετε αναφορές για το αν ανταποκρίνεται σε αλλαγές σύμφωνα με το αναμενόμενο ή όχι, ορίζοντας οι ίδιοι τί αντιστοιχεί σε επιτυχία (pass) ή αποτυχία (failure).

Script Structure

Μπορεί κάποιος να κάνει script απίθανα πράγματα για να κάνει δοκιμές. Π.χ. έστησα το δίκτυο μου ρίχνω ένα λινκ, πως συμπεριφέρεται το routing; Πόσοι neighbors υπάρχουν; Υπάρχει το τάδε route; Φτιάχνεις τα test σου, τρέχεις το script και βλέπεις που έχεις pass ή fail σε ωραία reports.

Μπορείτε να χρησιμοποιήσετε έτοιμα ήδη δημιουργημένα tests, γνωστά ως triggers.

Μπορείτε όμως να ορίσετε τα test σας και ως test cases, δηλαδή συλλογές από μικρότερα tests:

Μην ξεχνάτε ότι μπορείτε να πάρετε τα αποτελέσματα

Αν θέλετε όμως μπορείτε να ακολουθήσετε και τη δομή που περιέγραψε ο Julio Gomez (Cisco Developer Lead EMEAR) σε πέντε post από την καταπληκτική σειρά του για το DevOps:

PyATS Logger

Μπορείτε να οδηγήσετε το logging στα pyats tests/cases μέσω python, αλλά υπάρχει η δυνατότητα να το κάνετε και μέσω CLI, μέσω του PyATS log viewer https://pubhub.devnetcloud.com/media/pyats/docs/cli/pyats_logs.html

Αν τρέχετε το pyats σε Linux Desktop που διαθέτει GUI μπορείτε να προβάλλετε το log σε μορφή HTML σε browser. Όμως είναι πλέον δυνατό το PyATS να σηκώσει ένα webserver όπου μπορείτε να δείτε το Log. Φυσικά αν τρέχετε Xpresso, όλα αυτά είναι πιο εύκολα.

PyATS LogView

Δείτε γενικότερα για το logging στο PyATS εδώ: https://pubhub.devnetcloud.com/media/pyats/docs/log/index.html

Xpresso

To Xpresso είναι ένα ολοκληρωμένο γραφικό περιβάλλον βασισμένο σε web για τη χρήση του PyATS και τη δημιουργία HTML reports. Έχει πάρα πολλά χαρακτηριστικά και δυνατότητες, ξεφεύγει κατά πολύ από ένα απλό πακέτο λογισμικού.

Δείτε εδώ για ένα overview https://developer.cisco.com/docs/xpresso/#!overview Μπορείτε να το εγκαταστήσετε είτε ως συλλογή πακέτων λογισμικού είτε μέσω docker

Έχει σημαντικές απαιτήσεις σε πόρους (σε αντίθεση με το απλό pyats), οπότε φροντίστε να έχετε αρκετούς αν σκοπεύετε να το τρέξετε:

Operational Requirements and Constraints

Mock devices

Τα Mock Devices δεν είναι πραγματικά devices αλλά pre-recorded sets από commands & responses. Βασίζονται στο playback feature του Unicon library και δίνουν τη δυνατότητα να κάνει κάποιος practice με το PyATS χωρίς να έχει κανονικές συσκευές στη διάθεση του, άλλωστε το PyATS tutorial χρησιμοποιεί mock device:

To documentation για το πως δουλεύει το playback στο Unicon μπορείτε να το δείτε εδώ:

Αν θέλετε μπορείτε να δείτε κι αυτό το άρθρο από τον Gary Woodward:

Parsing for other python libraries (Netmiko, Scrapli, Ansible)

Netmiko

To γνωστό Python library του Kirk Byers προβλέπει τη χρήση network parsers για να παίρνει κανείς δεδομένα από τα sessions με τα network devices με δομημένο τρόπο. Όπως υποστηρίζεται το Text-FSM (NTC-Templates), υποστηρίζονται οι genie parsers με το option use_genie = True. Μπορείτε να διαβάσετε περισσότερα εδώ:

Scrapli

Με το Scrapli τo parsing των device responses γίνεται σε δεύτερο χρόνο. Η διαφορά είναι μικρή στην ουσία. Μπορείτε να διαβάσετε περισσότερα εδώ:

Ansible

To Ansible extension για να μπορεί κανείς να χρησιμοποιήσει το PyATS με το Ansible το έχει δημιουργήσει ο Clay Curtis. Περισσότερα μπορείτε να διαβάσετε εδώ:

PyATS Libraries (Dq, Clean)

Δεν σταματάνε όμως εδώ τα features του PyATS. Παρακάτω αναφέρονται δύο εξαιρετικά χρήσιμα από αυτά, τα οποία μπορούν να χρησιμοποιηθούν μαζί με το PyATS ή ξεχωριστά. Γενικά για τα χρήσιμα libraries του PyATS/Genie: https://pubhub.devnetcloud.com/media/genie-docs/docs/userguide/utils/index.html

Dq

To Dq είναι βιβλιοθήκη που βοηθάει στον εντοπισμό δεδομένων σε μια εμφωλευμένη δομή χωρίς κάποιος να χρειάζεται να ξέρει ακριβώς όλη τη δομή που πρέπει να “διασχίσει” μέχρι να φτάσει στο dictionary που τον ενδιαφέρει.

Up Ports with PyATS Dq

Up Ports Key-Value pairs with PyATS Dq

PyATS Clean

To PyATS clean επιτρέπει να επαναφέρουμε τη συσκευή σε μια συγκεκριμένη κατάσταση με συγκεκριμένο λογισμικό, ανεξάρτητα από το λογισμικό και την κατάσταση που είχε πριν την επαναφορά.

Use Cases

Τα Use Cases του PyATS περιορίζονται μόνο από τη φαντασία αλλά τα βασικότερα περιγράφονται παρακάτω:

  • Data Collection - Συλλογή στοιχείων από τις συσκευές του δικτύου για να πάρουμε ακριβή εικόνα του Network State. Μπορεί να έχει απλή μορφή, όπως output στο CLI, ή ακόμα και σε εργαλεία reporting, p.x. pyats -> prometheus pushgateway -> prometheus -> grafana. Σε αυτό το concept πρέπει κανείς να δει τί έχει φτιάξει ο John Cappobianco με το Merlin project.
  • Configuration - Αυτοματοποιημένο Configuration των συσκευών σειριακά ή παράλληλα, μόνο με το PyATS ή σε συνδυασμό με άλλα εργαλεία και βιβλιοθήκες.
  • Capturing changes χωρίς να μας ξέρουμε εκ των προτέρων ακριβώς το τί άλλαξε.
  • Testing (Chaos Monkey/Validation) - Μπορούμε να ελέγξουμε αν οι συσκευές μας ή το δίκτυο μας ανταποκρίνεται όπως πρέπει σε αλλαγές ή βλάβες. Σε αυτό το concept το PyATS μπορεί να χρησιμοποιηθεί και σε CI/CD pipelines για εφαρμογή Network Configuration As Code.

Learn about PyATS

pyATS for your Test Automation

Projects & Posts

Πολλά projects θα βρείτε σχετικά με το PyATS. Εδώ θα αναφέρουμε μόνο ένα, το Merlin, από τον John Cappobianco, ο οποίος έβαλε σκοπό να συνδυάσει το PyATS με ένα σωρό διαφορετικές τεχνολογίες (Jinja Templates, Django, Celery, Docker, Kubernetes, κλπ) και δυνατότητες:

  • Search as Code
  • 3D representation of network state
  • ChatOps
  • TextToSpeech
  • Automated Calling
  • Mind Maps
  • Scheduled Tasks
  • κλπ

Merlin Logo

Σχετικά links:

Περισσότερα για άλλα projects & integrations στα Links & Sources

Links - Sources

Exploring Genie Conf for Pythonic Device Configuration