Définir différents niveaux de sortie dans des RPC YANG personnalisés pour les équipements Junos
Définition de différents niveaux de sortie dans des RPC YANG personnalisés
Vous pouvez définir des RPC personnalisés pour les équipements Junos à l’aide de YANG. La sortie RPC peut être personnalisée pour émettre différentes données et mettre en forme cli en fonction de l’entrée RPC. Vous pouvez ainsi créer différents styles ou niveaux de sortie pour le même RPC.
Vous pouvez demander le style souhaité en incluant la valeur appropriée pour l’argument d’entrée lorsque vous appelez le RPC. Le script d’action doit traiter cet argument et émettre la sortie XML pour le style demandé. Junos OS traduit ensuite le XML en la sortie CLI correspondante définie pour ce style dans le module YANG. Le modèle RPC présenté dans cette rubrique crée deux styles : brief
et detail
.
Pour créer différents styles pour la sortie d’un RPC :
Le code suivant décrit la structure générale du RPC et du module d’enfermement. Lorsque vous appelez le RPC dans la CLI et que vous incluez l’argument level
d’entrée et spécifiez l’un brief
ou detail
, Junos OS rend la sortie définie pour ce style.
module module-name { namespace "http://yang.juniper.net/yang/1.1/jrpc"; prefix jrpc; import junos-extension { prefix junos; } import junos-extension-odl { prefix junos-odl; } organization "Juniper Networks, Inc."; description "Junos OS YANG module for custom RPCs"; rpc rpc-name { description "RPC description"; junos:command "cli-command" { junos:action-execute { junos:script "action-script-filename"; } } input { leaf level { type enumeration { enum brief { description "Display brief output"; } enum detail { description "Display detailed output"; } } } } output { container output-container { // leaf definitions junos-odl:style brief { junos-odl:format output-container-format-brief { // formatting for brief output } } junos-odl:style detail { junos-odl:format output-container-format-detail { // formatting for detailed output } } } } } }
Pour exécuter le RPC dans la CLI, exécutez la commande définie par l’instruction junos:command
et spécifiez le style en incluant l’argument de ligne de commande approprié, qui dans cet exemple est level
. Le script d’action correspondant traite l’argument d’entrée et émet la sortie pour le style demandé.
user@host> cli-command level brief
Exemple : définition de différents niveaux de production
Cet exemple présente un script d’action et de RPC YANG personnalisés qui déterminent si un hôte est accessible et impriment différents niveaux de sortie en fonction de l’entrée de l’utilisateur.
- Exigences
- Présentation du RPC et du script d’action
- Module YANG et script d’action
- Configuration
- Vérifier le RPC
Exigences
Cet exemple utilise les composants matériels et logiciels suivants :
-
Équipement exécutant Junos OS version 17.3R1 ou ultérieure qui prend en charge le chargement de modèles de données YANG personnalisés.
Présentation du RPC et du script d’action
Le module YANG dans cet exemple définit un RPC personnalisé pour ping sur l’hôte spécifié et renvoyer le résultat en utilisant différents niveaux de sortie en fonction de l’entrée de l’utilisateur. Le module rpc-style-test
YANG est enregistré dans le fichier rpc-style-test.yang . Le module importe les modules d’extension Junos OS, qui fournissent les extensions nécessaires pour exécuter des RPC personnalisés sur l’équipement et personnaliser la sortie CLI.
Le module définit le get-host-status
RPC. La <get-host-status>
balise de demande est utilisée pour exécuter à distance le RPC sur l’équipement. Dans la définition RPC, l’instruction junos:command
définit la commande utilisée pour exécuter le RPC dans l’interface CLI, qui est ici show host-status
.
rpc get-host-status { description "RPC example to retrieve host status"; junos:command "show host-status" { junos:action-execute { junos:script "rpc-style-test.py"; } } ...
Les junos:action-execute
instructions et junos:script
définissent le script d’action qui est appelé lorsque vous exécutez le RPC. Cet exemple utilise un script d’action Python nommé rpc-style-test.py pour récupérer les informations requises par le RPC. Le script renvoie les éléments de sortie XML pour chaque niveau de sortie défini dans l’instruction RPC output
.
À partir de la version 17.3 de Junos OS, l’instruction action-execute
est une sous-déclaration à command
. Dans les versions précédentes, les action-execute
déclarations et command
sont placées au même niveau, et l’instruction command
est facultative.
Le RPC a deux paramètres d’entrée, hostip
et level
. Le hostip
paramètre est l’hôte pour vérifier l’accessibilité. Le level
paramètre sélectionne le style de sortie du RPC. Lorsque vous exécutez le RPC, vous incluez l’adresse IP de l’hôte cible et un niveau, brief
ou detail
. Le script d’action définit la valeur par défaut pour level
, de sorte que 'brief'
si vous omettez cet argument, le RPC imprime la sortie correspondant au style bref.
input { leaf hostip { description "Host IP address"; type string; } leaf level { type enumeration { enum brief { description "Display brief output"; } enum detail { description "Display detailed output"; } } } }
Le RPC définit également les nœuds de sortie qui doivent être émis par le script d’action correspondant. Le nœud racine est l’élément <host-status-information>
, qui renferme l’élément <brief>
ou l’élément <detail>
, en fonction de l’entrée de l’utilisateur, ainsi que les nœuds de sortie enfants spécifiés pour chaque niveau de sortie. Les deux niveaux de sortie comprennent les <hostip>
éléments et <status>
les éléments enfants, mais l’élément <detail>
inclut également l’élément <date>
enfant. Les junos-odl:format
instructions définissent la mise en forme de la sortie affichée dans la CLI. Ce nœud n’est pas émis dans l’arbre XML de sortie.
output { container host-status-information { ... junos-odl:style brief { junos-odl:format host-status-information-format-brief { ... } } junos-odl:style detail { junos-odl:format host-status-information-format-detail { ... } } } }
Le script d’action ping l’hôte pour déterminer s’il est accessible et définit le statut en fonction des résultats. Le script construit et imprime ensuite le XML pour la sortie RPC en fonction de l’argument spécifié level
. L’arbre XML doit correspondre exactement à la hiérarchie définie dans le RPC.
Le module contenant le RPC et le fichier de script d’action sont ajoutés à l’équipement dans le cadre d’un nouveau package YANG nommé rpc-style-test
.
Module YANG et script d’action
YANG Module
Le module YANG, rpc-style-test.yang, définit le RPC, la commande utilisée pour exécuter le RPC dans la CLI et le nom du script d’action à invoquer lors de l’exécution du RPC. Le nom de base du fichier doit correspondre au nom du module.
/* * Copyright (c) 2014 Juniper Networks, Inc. * All rights reserved. */ module rpc-style-test { namespace "http://yang.juniper.net/yang/1.1/jrpc"; prefix jrpc; import junos-extension-odl { prefix junos-odl; } import junos-extension { prefix junos; } organization "Juniper Networks, Inc."; description "Junos OS YANG module for RPC example"; rpc get-host-status { description "RPC example to retrieve host status"; junos:command "show host-status" { junos:action-execute { junos:script "rpc-style-test.py"; } } input { leaf hostip { description "Host IP address"; type string; } leaf level { type enumeration { enum brief { description "Display brief output"; } enum detail { description "Display detailed output"; } } } } output { container host-status-information { leaf hostip { type string; description "Host IP"; } leaf status { type string; description "Operational status"; } leaf date { type string; description "Date information"; } junos-odl:style brief { junos-odl:format host-status-information-format-brief { junos-odl:header "Brief output\n"; junos-odl:picture "@<<<<<<<<<<<< @"; junos-odl:space; junos-odl:line { junos-odl:field "hostip"; junos-odl:field "status"; } } } junos-odl:style detail { junos-odl:format host-status-information-format-detail { junos-odl:header "Detail output\n"; junos-odl:picture "@<<<<<<<<<<<< @<<<<<<<<<<<< @"; junos-odl:space; junos-odl:line { junos-odl:field "hostip"; junos-odl:field "status"; junos-odl:field "date"; } } } } } } }
Script d’action
Le script d’action correspondant est rpc-style-test.py. Le script d’action imprime différents niveaux de sortie en fonction de la valeur de l’argument level
fourni par l’utilisateur. Le script définit une valeur par défaut de 'brief'
pour l’argument level
, de sorte que si l’utilisateur omet l’argument, le script renvoie le bref style de sortie. Cet exemple fournit deux versions du script d’action, qui gèrent correctement les arguments de ligne de commande du script pour les différentes versions.
- Script d’action (Junos OS version 21.2R1 et versions ultérieures)
- Script d’action (Junos OS version 21.1 et versions antérieures)
Script d’action (Junos OS version 21.2R1 et versions ultérieures)
#!/usr/bin/python3 # Junos OS Release 21.2R1 and later import os import argparse parser = argparse.ArgumentParser(description='This is a demo script.') parser.add_argument('--hostip', required=True) parser.add_argument('--level', required=False, default='brief') parser.add_argument('--rpc_name', required=True) args = parser.parse_args() f = os.popen('date') now = f.read() # Ping target host and set the status response = os.system('ping -c 1 ' + args.hostip + ' > /dev/null') if response == 0: pingstatus = "Host is Active" else: pingstatus = "Host is Inactive" # Print RPC XML for the given style print ("<host-status-information>") print ("<{}>".format(args.level)) print ("<hostip>{}</hostip>".format(args.hostip)) print ("<status>{}</status>".format(pingstatus)) if args.level == "detail": print ("<date>{}</date>".format(now)) print ("</{}>".format(args.level)) print ("</host-status-information>")
Script d’action (Junos OS version 21.1 et versions antérieures)
#!/usr/bin/python # Junos OS Release 21.1 and earlier import sys import os args = {'hostip': None, 'level': 'brief'} # Retrieve user input and store the values in the args dictionary for arg in args.keys(): if arg in sys.argv: index = sys.argv.index(arg) args[arg] = sys.argv[index+1] f = os.popen('date') now = f.read() # Ping target host and set the status if args['hostip'] is not None: response = os.system('ping -c 1 ' + args['hostip'] + ' > /dev/null') if response == 0: pingstatus = "Host is Active" else: pingstatus = "Host is Inactive" else: pingstatus = "Invalid host" # Print RPC XML for the given style print ("<host-status-information>") print ("<{}>".format(args['level'])) print ("<hostip>{}</hostip>".format(args['hostip'])) print ("<status>{}</status>".format(pingstatus)) if args['level'] == "detail": print ("<date>{}</date>".format(now)) print ("</{}>".format(args['level'])) print ("</host-status-information>")
Configuration
Permettre l’exécution des scripts Python
Pour permettre à l’équipement d’exécuter des scripts Python non signés :
-
Configurez l’instruction
language python
oulanguage python3
, en fonction de la version Junos OS.[edit] user@host# set system scripts language (python | python3)
Note:À partir de Junos OS version 20.2R1 et Junos OS Evolved version 22.3R1, l’équipement utilise Python 3 pour exécuter des actions YANG et des scripts de traduction. Dans les versions précédentes, Junos OS utilise uniquement Python 2.7 pour exécuter ces scripts, et Junos OS Evolved utilise Python 2.7 par défaut pour exécuter les scripts.
-
Validez la configuration.
[edit] user@host# commit and-quit
Charger le RPC sur l’équipement
Pour ajouter le RPC et le script d’action au schéma Junos sur l’équipement :
-
Téléchargez le module YANG et le script d’action sur l’équipement Junos.
-
Assurez-vous que le script d’action Python répond aux exigences suivantes :
-
Le propriétaire du fichier est soit racine, soit un utilisateur dans la classe de connexion Junos OS
super-user
. -
Seul le propriétaire du fichier a l’autorisation d’écrire le fichier.
-
Le script inclut la ligne de directive d’interpréteur appropriée, comme indiqué dans Créer des scripts d’action pour les RPC YANG sur les équipements Junos.
-
-
(Facultatif) Validez la syntaxe du module YANG et du script d’action.
user@host> request system yang validate module /var/tmp/rpc-style-test.yang action-script /var/tmp/rpc-style-test.py YANG modules validation : START YANG modules validation : SUCCESS Scripts syntax validation : START Scripts syntax validation : SUCCESS
-
Ajoutez le module YANG et le script d’action à un nouveau package YANG.
user@host> request system yang add package rpc-style-test module /var/tmp/rpc-style-test.yang action-script /var/tmp/rpc-style-test.py YANG modules validation : START YANG modules validation : SUCCESS Scripts syntax validation : START Scripts syntax validation : SUCCESS TLV generation: START TLV generation: SUCCESS Building schema and reloading /config/juniper.conf.gz ... Restarting mgd ...
-
Lorsque le système vous invite à redémarrer l’interface cli Junos OS, appuyez sur
Enter
pour accepter la valeur par défaut deyes
, ou tapez yes et appuyez surEnter
.WARNING: cli has been replaced by an updated version: ... Restart cli using the new version ? [yes,no] (yes) yes Restarting cli ...
Vérifier le RPC
But
Vérifiez que le RPC fonctionne comme prévu.
Action
À partir du mode opérationnel, exécutez le RPC dans la CLI en émettant la commande définie par l’instruction junos:command
dans la définition RPC. Incluez l’argument hostip
d’entrée et incluez l’argument level
pour chaque niveau de sortie différent.
user@host> show host-status hostip 198.51.100.1 level brief Brief output 198.51.100.1 Host is Active
Vous pouvez afficher le XML correspondant en ajoutant | display xml
à la commande.
user@host> show host-status hostip 198.51.100.1 level brief | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/18.3R1/junos"> <host-status-information> <brief> <hostip> 198.51.100.1 </hostip> <status> Host is Active </status> </brief> </host-status-information> <cli> <banner></banner> </cli> </rpc-reply>
De même, pour les résultats détaillés :
user@host> show host-status hostip 198.51.100.10 level detail Detail output 198.51.100.10 Host is Inactive Fri Feb 8 11:55:54 PST 2019
user@host> show host-status hostip 198.51.100.10 level detail | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/18.3R1/junos"> <host-status-information> <detail> <hostip> 198.51.100.10 </hostip> <status> Host is Inactive </status> <date> Fri Feb 8 16:03:35 PST 2019 </date> </detail> </host-status-information> <cli> <banner></banner> </cli> </rpc-reply>
Sens
Lorsque vous exécutez le RPC, l’équipement appelle le script d’action. Le script d’action imprime la hiérarchie XML pour le niveau de sortie défini dans l’instruction RPC output
. Lorsque le RPC est exécuté dans l’interface cli, l’équipement utilise la mise en forme CLI définie dans le RPC pour convertir la sortie XML en sortie CLI affichée.