Essayez d'utiliser le script de validation Python # 2 On-box de Junos

Aperçu

La dernière fois, j'ai présenté Op Script, qui est l'un des moyens les plus simples d'utiliser le Python On-box de Junos.

Poursuivant la dernière fois, je voudrais présenter Commit Script cette fois.

Qu'est-ce que Commit Script?

Un script de validation est un script du mécanisme de script de Junos appelé Junoscript qui est exécuté déclenché par "validation par l'utilisateur".

Le script de validation est appelé lorsque l'utilisateur exécute la validation et contrôle la validation ou modifie la configuration à valider en fonction des informations telles que l'utilisateur et l'heure de la validation, la configuration à valider, l'état actuel de l'appareil, etc. Vous pouvez faire des choses comme faire.

Par exemple, les cas d'utilisation suivants sont possibles.

Sous forme de dire, divers usages peuvent être envisagés selon l'idée.

Cette fois, je vais introduire Commit Script dans On-box Python avec un exemple simple.

Réglage

Pour utiliser le script de validation, vous devez écrire le script que vous souhaitez utiliser dans les paramètres comme suit.

set system scripts language python
set system scripts commit file commit-script.py

Le script décrit ici doit être préparé dans / var / db / scripts / commit.

Si vous souhaitez activer la méthode de changement de * Configuration transitoire * parmi les méthodes de changement de paramètre au moment de la validation, effectuez les paramètres supplémentaires suivants.

set system scripts commit allow-transients

Les détails seront décrits plus tard, mais il est nécessaire chaque fois qu'il y a un paramètre que vous souhaitez générer dynamiquement à partir du script, comme l'extension du paramètre par macro.

Exemple 1: Rejeter la validation d'une configuration qui ne contient pas les paramètres requis

Maintenant, essayons Commit Script.

Par exemple, un script qui refuse une configuration qui n'a pas de nom d'hôte défini est:

commit-script.py


from junos import Junos_Configuration
import jcs

def main():
  root = Junos_Configuration

  if root.find('./system/host-name') == None:
    jcs.emit_error("Hostname is not defined!!!")


if __name__ == '__main__':
  main()

En tant que termes uniques, Junos_Configuration et jcs sont mentionnés, mais Junos-Configuration est la racine XML de la configuration qui est sur le point d'être validée, et en vérifiant cela, vous pouvez la définir. Vous pouvez le vérifier et le modifier. jcs est un espace de noms qui définit des méthodes pour générer des événements, obtenir un statut, etc. dans Commit Script. Pour plus de détails, reportez-vous au Document officiel S'il vous plaît.

Le contenu du script est simple, extrayez le XML à la position de / system / host-name de la configuration, et lorsque le résultat est None, appelez jcs.emit_error et faites une erreur. Est sortie.

Le résultat de sortie sera le suivant.

[edit]
root@vmx1# show system host-name
host-name vmx1;

[edit]
root@vmx1# delete system host-name

[edit]
root@vmx1# commit check
error: Hostname is not defined!!!
error: 1 error reported by commit scripts
error: commit script failure

[edit]
root@vmx1# rollback 0
load complete

[edit]
root@vmx1# commit check
configuration check succeeds

De cette manière, la vérification de validation échouera uniquement si le nom d'hôte n'est pas inclus. Au fait, si vous voulez réussir la vérification de validation mais n'afficher que l'avertissement, utilisez jcs.emit_warning au lieu de jcs.emit_error.

Exemple 2: modifier les paramètres

Ensuite, je voudrais présenter un exemple de modification des paramètres.

Il existe deux façons de modifier les paramètres, l'une consiste à effectuer des modifications permanentes comme un utilisateur normal et l'autre à effectuer des modifications non persistantes (transitoires).

Essayons d'abord l'édition permanente. Par exemple, voici un exemple de script qui change le fuseau horaire du système en «Asie / Tokyo»:

commit-script.py


import jcs

def main():
  xml = '<system><time-zone>Asia/Tokyo</time-zone></system>'

  jcs.emit_change(xml, "change", "xml")

if __name__ == '__main__':
  main()

Vous pouvez modifier les paramètres en spécifiant les modifications, la méthode de changement et le format dans la méthode jcs.emit_change. Le format est actuellement uniquement xml.

Lorsque j'exécute ce script, cela ressemble à ceci:

[edit]
root@vmx1# show system time-zone

[edit]
root@vmx1# commit check
configuration check succeeds

[edit]
root@vmx1# show | compare
[edit system]
+  time-zone Asia/Tokyo;

De cette manière, le fuseau horaire est ajouté lorsque le script de validation est exécuté.

Exemple 3: génération dynamique de paramètres et application non persistante

Ensuite, je présenterai un exemple de mise en œuvre d'une chose dite macro et reflétant de manière transparente les paramètres générés sur l'appareil. À titre d'exemple (je ne peux pas penser à un exemple simple et bon), voici un exemple de script qui définit la description par défaut d'une interface et définit la description par défaut lorsqu'il y a une interface qui ne contient pas de description. Sera.

commit-script.py


from junos import Junos_Configuration
import jcs

def main():
  root = Junos_Configuration

  apply_macro = root.find("./interfaces/apply-macro[name='default-description']")

  xml_tmpl = '<interfaces>{0}</interfaces>'
  interface_xml_tmpl = '<interface><name>{0}</name><description>{1}</description></interface>'

  xml = ""

  if apply_macro:
    description_template = apply_macro.find('./data/name').text

    for element in root.findall("./interfaces/interface"):
      if element.find('description') is None:
        ifd_name = element.find('name').text
        xml += interface_xml_tmpl.format(ifd_name, description_template.format(ifd_name))

    xml = xml_tmpl.format(xml)

    jcs.emit_change(xml, "transient-change", "xml")

if __name__ == '__main__':
  main()

Dans ce script, si la macro appelée default-description est définie directement sous les interfaces, la liste des interfaces est vérifiée, et pour les interfaces pour lesquelles Description n'est pas définie, le texte spécifié dans la macro default-description est spécifié. Faites un pas.

Le point de générer des changements dans XML est le même qu'avant, mais le deuxième argument de jcs.emit_change est passé de" change " à "transient-change" `. Il s'agit d'une option permettant de traiter le paramètre comme temporaire et de ne pas l'enregistrer dans le fichier de paramètres.

Comme mentionné ci-dessus, lors de l'utilisation de «transient-change», il est nécessaire de saisir les paramètres suivants.

set system scripts commit allow-transients

Lorsque ce script est appliqué, il se comporte comme suit.

root@vmx1# show interfaces | display set
set interfaces apply-macro default-description "Description is not configured({0})"
set interfaces ge-0/0/0 disable
set interfaces ge-0/0/0 vlan-tagging
set interfaces ge-0/0/0 unit 1001 vlan-id 1001
set interfaces ge-0/0/0 unit 1001 family inet address 10.0.1.1/24
set interfaces ge-0/0/1 description test
set interfaces ge-0/0/1 unit 0 family inet
set interfaces fxp0 unit 0 family inet address 172.23.1.111/24

[edit]
root@vmx1# commit
commit complete

[edit]
root@vmx1# run show interfaces descriptions
Interface       Admin Link Description
ge-0/0/0        down  down Description is not configured(ge-0/0/0)
ge-0/0/1        up    down test
fxp0            up    up   Description is not configured(fxp0)

[edit]
root@vmx1# run show configuration interfaces | display set
set interfaces apply-macro default-description "Description is not configured({0})"
set interfaces ge-0/0/0 disable
set interfaces ge-0/0/0 vlan-tagging
set interfaces ge-0/0/0 unit 1001 vlan-id 1001
set interfaces ge-0/0/0 unit 1001 family inet address 10.0.1.1/24
set interfaces ge-0/0/1 description test
set interfaces ge-0/0/1 unit 0 family inet
set interfaces fxp0 unit 0 family inet address 172.23.1.111/24

Pouvez-vous voir la différence par rapport au précédent? Dans le n ° 2, les paramètres ont été modifiés pendant l'étape de vérification de la validation et les modifications sont apparues dans les paramètres. D'un autre côté, si vous utilisez transient-change, il semble que la configuration n'ait pas été modifiée à première vue, mais si vous vérifiez l'opération réelle, vous pouvez voir que la description est définie dans Interface.

Avec transient-change, il est possible de macroser les paramètres de cette manière et de masquer les paramètres réels de l'appareil autres que les paramètres essentiels. Par exemple, s'il y a un grand nombre de clients et qu'un grand nombre de paramètres est requis, mais que les différences entre les clients sont insignifiantes, il sera possible de faire des réglages efficacement et avec une bonne visibilité.

En passant, si vous souhaitez vérifier les paramètres qui s'exécutent réellement sur l'appareil, vous pouvez vérifier comme suit.

root@vmx1> show configuration interfaces | display set | display commit-scripts
set interfaces apply-macro default-description "Description is not configured({0})"
set interfaces ge-0/0/0 description "Description is not configured(ge-0/0/0)"
set interfaces ge-0/0/0 disable
set interfaces ge-0/0/0 vlan-tagging
set interfaces ge-0/0/0 unit 1001 vlan-id 1001
set interfaces ge-0/0/0 unit 1001 family inet address 10.0.1.1/24
set interfaces ge-0/0/1 description test
set interfaces ge-0/0/1 unit 0 family inet
set interfaces fxp0 description "Description is not configured(fxp0)"
set interfaces fxp0 unit 0 family inet address 172.23.1.111/24

en conclusion

Cette fois, j'ai présenté Commit Script comme l'une des utilisations de Junoscript par On-box Python. J'espère que vous comprendrez qu'il existe différentes manières de l'utiliser. Le contenu introduit cette fois ne peut être implémenté qu'en XSLT / Slax, mais je pense qu'il est devenu possible d'écrire en Python et qu'il est devenu très facile de s'impliquer.

La prochaine fois, j'aimerais vous présenter comment l'utiliser dans Event Script.

Recommended Posts

Essayez d'utiliser le script de validation Python # 2 On-box de Junos
Essayez d'utiliser le script d'opération Python # 1 On-box de Junos
Essayez d'utiliser le Python On-box de Junos #Bonus 1 Quelque chose comme ChatOps / Commit et publiez sur Slack
Essayez d'utiliser Tweepy [Python2.7]
[Python] Essayez d'utiliser le canevas de Tkinter
Essayez d'utiliser Kubernetes Client -Python-
Essayez d'utiliser l'API de Pleasant (python / FastAPI)
Essayez d'utiliser LevelDB avec Python (plyvel)
Essayez d'utiliser l'API d'action de Python argparse
Essayez d'utiliser le module Python Cmd
Essayez d'utiliser LeapMotion avec Python
Essayez d'utiliser Amazon DynamoDB à partir de Python
Essayez Python
Essayez une formule utilisant Σ avec python
Essayez d'utiliser l'API Kraken avec Python
Dialogflow (anciennement: API.AI) Essayez d'utiliser le SDK Python #dialogflow
Essayez d'utiliser Python avec Google Cloud Functions
Essayez d'utiliser Excel en utilisant Python (Xlwings)
Fichier python de script
Essayez d'utiliser docker-py
squelette de script python
Essayez d'utiliser Cookiecutter
Essayez d'utiliser PDFMiner
Essayez d'utiliser l'API BitFlyer Ligntning en Python
Profilage de script Python
Python: essayez d'utiliser l'interface utilisateur sur Pythonista 3 sur iPad
Commencez à utiliser Python
Importer un script python
Essayez d'utiliser Selenium
Essayez d'utiliser scipy
Python> essayez: / sauf:
Essayez d'utiliser le framework Web Python Tornado Partie 1
Essayez d'utiliser pandas.DataFrame
Essayez Juniper JUNOS PyEz (bibliothèque python) Note 1 ~ Présentation de PyEz ~
Essayez d'utiliser le module de collections (ChainMap) de python3
Essayez d'utiliser tensorflow ① Créez un environnement python et introduisez tensorflow
Essayez d'utiliser django-swiftbrowser
Essayez d'utiliser matplotlib
Essayez d'utiliser le framework Web Python Tornado Partie 2
Essayez d'utiliser tf.metrics
Essayez d'utiliser PyODE
Exécutez des scripts Python à partir d'Excel (en utilisant xlwings)
Scraping à l'aide de Python
Essayez d'utiliser l'API ChatWork et l'API Qiita en Python
Essayez d'utiliser l'API DropBox Core avec Python
Essayez de créer un fichier compressé en utilisant Python et zlib
(Python) Essayez de développer une application Web en utilisant Django
Essayez de projeter la conversion d'image en utilisant OpenCV avec Python
Essayez d'extraire des mots à haute fréquence en utilisant NLTK (python)
Essayez de gratter avec Python.
Manipuler Redmine à l'aide de Python Redmine
Séquence de Fibonacci utilisant Python
python essayez ~ sauf ~ autre
Nettoyage des données à l'aide de Python
[Azure] Essayez d'utiliser Azure Functions
Essayez Debian + Python 3.4 + django1.7 ……
Utilisation des packages Python #external
Essayez d'utiliser virtualenv maintenant
Mémo de script DynamoDB (Python)