Afficher les options de commande valides et les valeurs de l’énoncé de configuration dans l’interface cli pour les modules YANG personnalisés
Certains équipements Junos vous permettent de charger des modules YANG personnalisés sur l’équipement pour ajouter des modèles de données qui ne sont pas pris en charge nativement par Junos OS. Lorsque vous ajoutez des modèles de données YANG personnalisés à un équipement, vous devez également fournir un script d’action ou de traduction qui gère la logique de traduction entre le modèle de données YANG et Junos OS. Bien que la logique de script puisse s’assurer qu’un utilisateur fournit des valeurs valides pour une option de commande ou une instruction de configuration donnée, cette logique n’est pas toujours transparente pour l’utilisateur. À partir de la version 19.2R1 de Junos OS, l’interface cli affiche l’ensemble des valeurs possibles pour certaines options de commande ou déclarations de configuration dans un modèle de données YANG personnalisé lorsque vous incluez l’instruction action-expand
d’extension dans l’option ou la définition de l’instruction et que vous référencez un script qui gère la logique.
Comprendre l’aide contextuelle pour les modules YANG personnalisés
La CLI Junos fournit une aide contextuelle chaque fois que vous saisissez un point d’interrogation (?) en mode opérationnel ou de configuration. Lorsque vous exécutez une commande ou configurez une instruction, l’aide contextuelle de l’interface cli affiche les options et les valeurs d’option valides pour une commande, ou les déclarations de configuration valides et les valeurs d’instruction de branche dans la hiérarchie d’instructions de configuration. En outre, une aide contextuelle indique les remplissages possibles pour les noms d’options, les noms d’instruction et leurs valeurs incomplets.
L’interface CLI peut également afficher les valeurs valables pour certaines options de commande ou instructions de configuration dans un modèle de données YANG personnalisé. La CLI peut afficher toutes les valeurs possibles ou un sous-ensemble de valeurs qui correspondent sur une entrée partielle de l’utilisateur. Par exemple :
user@host> show host-status hostip ? Possible completions: <hostip> Host IP address 10.10.10.1 IPv4 address 10.10.10.2 IPv4 address 172.16.0.1 IPv4 address 198.51.100.1 IPv4 address 198.51.100.10 IPv4 address 2001:db8::1 IPv6 address (DC 1...128) 2001:db8::fdd2 IPv6 address (DC 1...128)
user@host> show host-status hostip 198? Possible completions: <hostip> Host IP address 198.51.100.1 IPv4 address 198.51.100.10 IPv4 address
Pour afficher l’ensemble de valeurs valides pour une option de commande ou une déclaration de configuration donnée dans un module YANG personnalisé :
-
Définissez les
action-expand
déclarations etscript
d’extension sous le paramètre d’entrée ou l’énoncé de configuration approprié dans le module YANG, comme décrit dans la section Définition du module YANG. -
Créez un script Python qui vérifie les entrées de l’utilisateur, calcule les valeurs possibles de l’option de commande ou de l’instruction de configuration et envoie la sortie appropriée à la CLI, comme décrit dans Création du script d’extension CLI.
Note:Le script d’extension CLI affiche uniquement les valeurs valides dans l’interface cli. Le script de traduction ou le script d’action du module doit toujours inclure la logique qui garantit que seules les valeurs valides sont acceptées et traitées.
-
Chargez le module YANG, les scripts de traduction ou d’action et le script d’extension CLI dans le cadre d’un package YANG personnalisé sur l’équipement, comme décrit dans la section Chargement du package YANG.
Note:Les équipements Junos traitent les scripts d’extension CLI comme un autre type de script d’action, mais nous faisons référence au script d’extension CLI pour éviter toute confusion.
Définition du module YANG
Pour définir un module YANG personnalisé qui affiche l’ensemble des valeurs valides pour une option de commande ou une déclaration de configuration donnée lorsque l’utilisateur demande une aide contextuelle dans la CLI, votre module doit :
Par exemple, dans le module suivant, le RPC définit le hostip
paramètre d’entrée, qui appelle le hostip-expand.py
script Python lorsque l’utilisateur demande une aide contextuelle pour l’argument hostip
dans la CLI. Le script implémente la logique personnalisée qui affiche les valeurs valides pour cet argument dans l’interface cli.
module rpc-host-status { namespace "http://yang.juniper.net/examples/rpc-cli"; prefix jrpc; import junos-extension-odl { prefix junos-odl; } import junos-extension { prefix junos; } rpc get-host-status { description "RPC example to retrieve host status"; junos:command "show host-status" { junos:action-execute { junos:script "rpc-host-status.py"; } } input { leaf hostip { description "Host IP address"; type string; junos:action-expand { junos:script "hostip-expand.py"; } } leaf level { type enumeration { enum brief { description "Display brief output"; } enum detail { description "Display detailed output"; } } } } output { ... } } }
Création du script d’extension CLI
Lorsque vous définissez l’instruction et script
la action-expand
sous-déclaration d’une option de commande ou d’une déclaration de configuration dans un module YANG personnalisé et que vous demandez une aide contextuelle pour cette option ou cette valeur d’instruction dans l’interface de ligne de commande, l’équipement appelle le script Python référencé. Le script doit contenir la logique personnalisée qui calcule et affiche toutes les valeurs possibles pour ce paramètre ou affiche un sous-ensemble de valeurs qui correspondent à l’entrée partielle de l’utilisateur.
Par exemple, la commande suivante doit afficher toutes les valeurs valides pour l’argument hostip
:
user@host> show host-status hostip ?
Et la commande suivante doit afficher toutes les valeurs valides commençant par « 198 » :
user@host> show host-status hostip 198?
Pour afficher les valeurs valides d’une option de commande ou d’une déclaration de configuration dans l’interface cli, le script Python doit exécuter les fonctions suivantes :
-
Importez la
jcs
bibliothèque ainsi que toutes les autres bibliothèques Python requises. -
Récupérez et traitez n’importe quelle entrée utilisateur.
Si vous spécifiez une entrée partielle pour une option ou une valeur d’instruction dans l’interface cli, les arguments de ligne de commande du script incluent l’argument
symbol
, qui est une chaîne contenant l’entrée utilisateur.Note:À partir de Junos OS version 21.2R1 et Junos OS Evolved version 21.2R1, les arguments de ligne de commande du script incluent l’argument à la
--symbol
place de l’argumentsymbol
. -
Définissez ou calculez les valeurs valides pour le paramètre.
-
Appelez la
jcs.expand()
fonction pour chaque valeur à afficher sur la ligne de commande.
Le script doit appeler la jcs:expand()
fonction pour chaque option ou valeur d’instruction à afficher dans la CLI. La syntaxe de la jcs:expand()
fonction est :
jcs.expand(value, description, <units>, <range>)
Où:
value | Chaîne définissant une valeur valide pour l’option de commande ou l’instruction de configuration donnée. |
description | Chaîne qui décrit la valeur. |
units | (Facultatif) Chaîne qui définit les unités pour la valeur correspondante. |
range | (Facultatif) Chaîne qui définit la plage de la valeur correspondante. |
Pour chaque appel à la jcs.expand()
fonction, le script émet la valeur, la description, les unités et la plage qui sont fournies dans les arguments de la fonction dans la CLI. Par exemple, à l’appel jcs.expand()
suivant dans le script :
jcs.expand("2001:db8:4136::fdd2", "IPv6 address", "DC", "1...128")
La sortie CLI correspondante est :
Possible completions: <hostip> Host IP address 2001:db8:4136::fdd2 IPv6 address (DC 1...128)
Les exemples de scripts suivants vérifient d’abord la présence des arguments de symbol
ligne de commande du script et, le cas échéant, définissent la variable correspondante égale à l’entrée de l’utilisateur. Les scripts calculent ensuite l’ensemble des valeurs valides pour le paramètre en fonction de l’entrée de l’utilisateur. Enfin, les scripts appellent la jcs.expand()
fonction pour chaque valeur à afficher dans la CLI.
Nous fournissons deux versions du script, qui gèrent correctement l’argument du symbol
script pour les différentes versions. L’exemple de script suivant, valable sur les équipements exécutant Junos OS version 21.2R1 ou ultérieure, utilise la argparse
bibliothèque pour analyser l’argument --symbol
.
#!/usr/bin/python3 # Junos OS Release 21.2R1 and later import jcs import argparse parser = argparse.ArgumentParser(description='This is a demo script.') parser.add_argument('--symbol', required=False, default='') args = parser.parse_args() description_ipv4 = "IPv4 address" description_ipv6 = "IPv6 address" expand_colon = ":" expand_units = "DC" expand_range = "1...128" item = ["10.10.10.1", "10.10.10.2", "2001:db8::1", "172.16.0.1", "198.51.100.1", "198.51.100.10", "2001:db8::fdd2"] for ip in item: if ip.startswith(args.symbol) or not args.symbol: if not expand_colon in ip: jcs.expand(ip, description_ipv4) else: jcs.expand(ip, description_ipv6, expand_units, expand_range)
De même, l’exemple de script suivant, qui est valable sur les équipements exécutant Junos OS version 21.1 ou antérieure, vérifie symbol
si dans la sys.argv
liste.
#!/usr/bin/python # Junos OS Release 21.1 and earlier import sys import jcs symbol = "" # Retrieve user input in symbol argument and store the value if "symbol" in sys.argv: index = sys.argv.index("symbol") symbol = sys.argv[index+1] description_ipv4 = "IPv4 address" description_ipv6 = "IPv6 address" expand_colon = ":" expand_units = "DC" expand_range = "1...128" item = ["10.10.10.1", "10.10.10.2", "2001:db8::1", "172.16.0.1", "198.51.100.1", "198.51.100.10", "2001:db8::fdd2"] for ip in item: if ip.startswith(symbol) or not symbol: if not expand_colon in ip: jcs.expand(ip, description_ipv4) else: jcs.expand(ip, description_ipv6, expand_units, expand_range)
Le script d’extension CLI affiche uniquement les valeurs, unités et plages valides pour l’option de commande ou l’énoncé de configuration dans la CLI. Le script de traduction ou le script d’action du module doit s’assurer que seules les valeurs valides sont acceptées et traitées.
Chargement du paquet YANG
Lorsque vous chargez un package YANG sur un équipement Junos, incluez les scripts d’extension CLI dans la liste des scripts d’action pour ce package. Junos OS copie automatiquement le script dans le répertoire /var/db/scripts/action .
Pour charger un nouveau package et inclure des scripts d’extension CLI personnalisés :
Exemple : affichage d’une aide contextuelle pour une option de commande
Cet exemple présente un module YANG personnalisé qui utilise l’instruction action-expand
d’extension et un script personnalisé pour afficher l’ensemble des valeurs possibles pour l’une des options de commande lorsqu’un utilisateur demande une aide contextuelle dans l’interface de ligne de commande pour cette option.
Exigences
Cet exemple utilise les composants matériels et logiciels suivants :
-
Équipement exécutant Junos OS version 19.2R1 ou ultérieure qui prend en charge le chargement de modèles de données YANG personnalisés.
Aperçu
Le module YANG dans cet exemple définit un RPC personnalisé pour ping sur l’hôte spécifié et renvoyer le résultat. Le module rpc-host-status
YANG est enregistré dans le fichier rpc-host-status.yang . Le module importe les modules d’extension Junos OS, qui fournissent les extensions requises pour exécuter des RPC personnalisés sur l’équipement et personnaliser la sortie et l’aide contextuelle dans la CLI.
Le module définit le get-host-status
RPC. L’instruction junos:command
définit la commande utilisée pour exécuter le RPC dans l’interface cli, qui dans ce cas est show host-status
. Les junos:action-execute
instructions et junos:script
définissent le script d’action qui est appelé lorsque vous exécutez le RPC.
rpc get-host-status { description "RPC example to retrieve host status"; junos:command "show host-status" { junos:action-execute { junos:script "rpc-host-status.py"; } }
Le hostip
paramètre d’entrée inclut les junos:action-expand
instructions et junos:script
qui définissent le script qui est appelé lorsque l’utilisateur demande une aide contextuelle dans la CLI pour ce paramètre d’entrée.
input { leaf hostip { description "Host IP address"; type string; junos:action-expand { junos:script "hostip-expand.py"; } } ... }
Le script hostip-expand.py traite l’entrée de l’utilisateur, qui est transmise au script en tant qu’argument symbol
ou --symbol
, en fonction de la version. Le script calcule et affiche ensuite l’ensemble des valeurs que l’utilisateur peut saisir pour cette option de commande.
À partir de Junos OS version 21.2R1 et Junos OS Evolved version 21.2R1, lorsque l’équipement transmet des arguments de ligne de commande à un script d’action Python (y compris les scripts d’extension CLI), il préfixe un seul trait d’union (-) vers des noms d’arguments à caractère unique et préfixe deux traits d’union (--) à des noms d’arguments multi-caractères.
Le script d’extension affiche les valeurs valides dans hostip
la CLI. Le script d’action implémente la logique qui détermine si la valeur fournie est valide. Cet exemple ajoute le module YANG et les scripts d’action à l’équipement dans le cadre d’un nouveau package YANG nommé rpc-host-status
.
Module YANG et scripts d’action
YANG Module
Le module YANG, rpc-host-status.yang, définit le RPC, la commande utilisée pour exécuter le RPC dans la CLI, le nom du script d’action à invoquer lorsque vous exécutez le RPC et le nom du script d’extension CLI à invoquer lorsque l’utilisateur demande une aide contextuelle pour le paramètre d’entrée correspondant.
/* * Copyright (c) 2019 Juniper Networks, Inc. * All rights reserved. */ module rpc-host-status { namespace "http://yang.juniper.net/examples/rpc-cli"; 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-host-status.py"; } } input { leaf hostip { description "Host IP address"; type string; junos:action-expand { junos:script "hostip-expand.py"; } } 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-host-status.py. 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() valid_addresses = ["10.10.10.1", "10.10.10.2", "2001:db8::1", "172.16.0.1", "198.51.100.1", "198.51.100.10", "2001:db8::fdd2"] f = os.popen('date') now = f.read() # Ping target host and set the status if args.hostip in valid_addresses: 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>")
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'} valid_addresses = ["10.10.10.1", "10.10.10.2", "2001:db8::1", "172.16.0.1", "198.51.100.1", "198.51.100.10", "2001:db8::fdd2"] # 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'] in valid_addresses: 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>")
Script d’extension CLI
Le script d’action qui gère la logique d’affichage des hostip
valeurs valides dans l’interface cli est hostip-expand.py. Cet exemple fournit deux versions du script, qui gèrent correctement les arguments du script pour les différentes versions.
- Script d’extension CLI (Junos OS version 21.2R1 et versions ultérieures)
- Script d’extension CLI (Junos OS version 21.1 et versions antérieures)
Script d’extension CLI (Junos OS version 21.2R1 et versions ultérieures)
#!/usr/bin/python3 # Junos OS Release 21.2R1 and later import jcs import argparse parser = argparse.ArgumentParser(description='This is a demo script.') parser.add_argument('--symbol', required=False, default='') args = parser.parse_args() description_ipv4 = "IPv4 address" description_ipv6 = "IPv6 address" expand_colon = ":" expand_units = "DC" expand_range = "1...128" item = ["10.10.10.1", "10.10.10.2", "2001:db8::1", "172.16.0.1", "198.51.100.1", "198.51.100.10", "2001:db8::fdd2"] for ip in item: if ip.startswith(args.symbol) or not args.symbol: if not expand_colon in ip: jcs.expand(ip, description_ipv4) else: jcs.expand(ip, description_ipv6, expand_units, expand_range)
Script d’extension CLI (Junos OS version 21.1 et versions antérieures)
#!/usr/bin/python # Junos OS Release 21.1 and earlier import sys import jcs symbol = "" # Retrieve user input in symbol argument and store the value if "symbol" in sys.argv: index = sys.argv.index("symbol") symbol = sys.argv[index+1] description_ipv4 = "IPv4 address" description_ipv6 = "IPv6 address" expand_colon = ":" expand_units = "DC" expand_range = "1...128" item = ["10.10.10.1", "10.10.10.2", "2001:db8::1", "172.16.0.1", "198.51.100.1", "198.51.100.10", "2001:db8::fdd2"] for ip in item: if ip.startswith(symbol) or not symbol: if not expand_colon in ip: jcs.expand(ip, description_ipv4) else: jcs.expand(ip, description_ipv6, expand_units, expand_range)
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
Chargez le module YANG et les scripts sur l’équipement
Pour ajouter le module YANG et les scripts à l’équipement Junos :
-
Téléchargez le module YANG et les scripts sur l’équipement Junos.
-
Assurez-vous que les scripts Python répondent 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 des scripts d’action.
user@host> request system yang validate module /var/tmp/rpc-host-status.yang action-script [ /var/tmp/rpc-host-status.py /var/tmp/hostip-expand.py ] YANG modules validation : START YANG modules validation : SUCCESS Scripts syntax validation : START Scripts syntax validation : SUCCESS
-
Ajoutez le module YANG et les scripts à un nouveau package YANG.
user@host> request system yang add package rpc-host-status module /var/tmp/rpc-host-status.yang action-script [ /var/tmp/rpc-host-status.py /var/tmp/hostip-expand.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 ... mgd: commit complete 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érification de l’aide contextuelle
But
Vérifiez que le script d’extension CLI fonctionne comme prévu.
Action
À partir du mode opérationnel, demandez une aide contextuelle dans l’interface de ligne de commande en publiant la commande définie par l’instruction junos:command
dans la définition RPC, et incluez l’argument hostip
d’entrée et un point d’interrogation (?).
user@host> show host-status hostip ? Possible completions: <hostip> Host IP address 10.10.10.1 IPv4 address 10.10.10.2 IPv4 address 172.16.0.1 IPv4 address 198.51.100.1 IPv4 address 198.51.100.10 IPv4 address 2001:db8::1 IPv6 address (DC 1...128) 2001:db8::fdd2 IPv6 address (DC 1...128)
Effectuez la même opération avec une entrée partielle de l’utilisateur et vérifiez que les valeurs affichées correspondent correctement à l’entrée.
user@host> show host-status hostip 198? Possible completions: <hostip> Host IP address 198.51.100.1 IPv4 address 198.51.100.10 IPv4 address
Sens
Lorsqu’une aide contextuelle est demandée pour la hostip
valeur, l’équipement appelle le hostip-expand.py
script. Le script traite l’entrée de l’utilisateur, si elle est fournie, et imprime les données valides dans la CLI. Si aucune entrée utilisateur n’est donnée, le script imprime toutes les valeurs possibles. Lorsque l’entrée de l’utilisateur est fournie, le script imprime uniquement les valeurs correspondantes.