Utiliser Junos PyEZ pour récupérer une configuration
RÉSUMÉ Vous pouvez créer des applications Junos PyEZ qui récupèrent les données de configuration à partir de la base de données de configuration spécifiée sur un équipement Junos.
Les applications Junos PyEZ peuvent exécuter des appels de procédure à distance (RPC) à la demande sur les équipements Junos. Après avoir créé une instance de la Device
classe, une application peut exécuter des RPC en tant que propriété de l’instance Device
. Les applications Junos PyEZ peuvent utiliser le get_config()
RPC pour demander la configuration complète ou des parties sélectionnées de la configuration, tant pour la configuration Junos OS native que pour les données de configuration correspondant aux modèles de données YANG standard (IETF, OpenConfig) ou personnalisés qui ont été ajoutés au périphérique.
Le RPC Junos PyEZ get_config
appelle l’opération du protocole <get-configuration>
XML Junos. Pour plus d’informations sur l’opération <get-configuration>
et ses options, consultez <get-configuration>.
Cette rubrique explique comment récupérer la configuration à l’aide du RPC Junos PyEZ get_config()
. Pour plus d’informations sur l’utilisation des tables et des vues pour récupérer des données de configuration, reportez-vous aux sections Définition des tables de configuration Junos PyEZ et Utiliser les tables de configuration Junos PyEZ pour récupérer les données de configuration.
Récupérer la configuration candidate complète
Pour récupérer la configuration candidate complète à partir d’un équipement Junos, exécutez le get_config()
RPC. Le format de sortie par défaut est XML. Par exemple :
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config() print (etree.tostring(data, encoding='unicode', pretty_print=True))
Spécifier la base de données source pour les données de configuration
Lorsqu’une application Junos PyEZ utilise le RPC pour récupérer des get_config()
informations de configuration à partir d’un périphérique Junos, le serveur renvoie par défaut les données de la base de données de configuration candidate. Une application Junos PyEZ peut également récupérer des données de configuration à partir de la base de données de configuration validée ou de la base de données de configuration éphémère.
Base de données de configuration candidate
Pour récupérer des données à partir de la base de données de configuration candidate, exécutez le get_config()
RPC et incluez éventuellement des arguments supplémentaires.
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config() print (etree.tostring(data, encoding='unicode', pretty_print=True))
Base de données de configuration validée
Pour récupérer des données à partir de la base de données de configuration validée, incluez l’argument options
with 'database':'committed'
dans l’appel get_config()
RPC.
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(options={'database' : 'committed'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
Base de données de configuration éphémère
Junos PyEZ prend en charge les opérations sur la base de données de configuration éphémère sur les équipements qui prennent en charge cette base de données. Lorsque vous récupérez des données de configuration à partir de la base de données de configuration partagée, par défaut, les résultats n’incluent pas les données de la base de données de configuration éphémère.
La base de données éphémère est une base de données de configuration alternative qui fournit une interface de programmation rapide pour effectuer des mises à jour de configuration sur les équipements Junos. La base de données de configuration éphémère est une fonctionnalité avancée qui, si elle est mal utilisée, peut avoir un impact négatif sérieux sur le fonctionnement de l’appareil. Pour plus d’informations, reportez-vous à la section Présentation de la base de données de configuration éphémère.
Pour récupérer des données à partir de l’instance par défaut de la base de données de configuration éphémère, ouvrez d’abord l’instance éphémère par défaut, puis demandez les données. Pour ouvrir l’instance par défaut, utilisez un gestionnaire de contexte pour créer l’instance Config
et incluez l’argument mode='ephemeral'
. Par exemple :
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from lxml import etree dev = Device(host='router1.example.net') try: dev.open() with Config(dev, mode='ephemeral') as cu: data = dev.rpc.get_config(options={'format':'text'}) print(etree.tostring(data, encoding='unicode')) dev.close() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) except Exception as err: print (err)
Pour récupérer des données à partir d’une instance spécifique de la base de données de configuration éphémère, ouvrez d’abord l’instance éphémère, puis demandez les données. Pour ouvrir une instance définie par l’utilisateur de la base de données de configuration éphémère, utilisez un gestionnaire de contexte pour créer l’instance Config
, inclure l’argument mode='ephemeral'
et définir l’argument ephemeral_instance
sur le nom de l’instance éphémère.
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from lxml import etree dev = Device(host='router1.example.net') try: dev.open() with Config(dev, mode='ephemeral', ephemeral_instance='eph1') as cu: data = dev.rpc.get_config(options={'format':'text'}) print(etree.tostring(data, encoding='unicode')) dev.close() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) except Exception as err: print (err)
Spécifiez l’étendue des données de configuration à renvoyer
Outre la récupération de la configuration complète de Junos OS, une application Junos PyEZ peut récupérer des parties spécifiques de la configuration en appelant le get_config()
RPC avec l’argument filter_xml
. Le filter_xml
paramètre prend une chaîne contenant le filtre de sous-arborescence qui sélectionne les instructions de configuration à renvoyer. Le filtre de sous-arborescence renvoie les données de configuration qui correspondent aux critères de sélection.
Pour demander plusieurs hiérarchies, la filter_xml
chaîne doit inclure l’élément <configuration>
racine. Dans le cas contraire, la valeur de filter_xml
doit représenter tous les niveaux de la hiérarchie de configuration, en commençant juste en dessous de l’élément racine <configuration>
jusqu’à la hiérarchie à afficher. Pour sélectionner une sous-arborescence, incluez la balise vide pour ce niveau hiérarchique. Pour renvoyer un objet spécifique, incluez un nœud de correspondance de contenu qui définit l’élément et la valeur à faire correspondre.
L’application Junos PyEZ suivante récupère et imprime la configuration aux niveaux et [edit interfaces]
[edit protocols]
hiérarchie dans la configuration candidate :
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: filter = '<configuration><interfaces/><protocols/></configuration>' data = dev.rpc.get_config(filter_xml=filter) print (etree.tostring(data, encoding='unicode', pretty_print=True))
L’exemple suivant récupère et imprime la configuration au niveau de la hiérarchie à l’aide [edit system services]
de valeurs différentes mais équivalentes pour l’argument filter_xml
:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='<system><services/></system>') print (etree.tostring(data, encoding='unicode', pretty_print=True)) data = dev.rpc.get_config(filter_xml='system/services') print (etree.tostring(data, encoding='unicode', pretty_print=True)) filter = etree.XML('<system><services/></system>') data = dev.rpc.get_config(filter_xml=filter) print (etree.tostring(data, encoding='unicode', pretty_print=True))
L’exemple suivant récupère l’élément <name>
pour chaque <interface>
élément de la <interfaces>
hiérarchie dans la configuration candidate post-héritage :
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: filter = '<interfaces><interface><name/></interface></interfaces>' data = dev.rpc.get_config(filter_xml=filter, options={'inherit':'inherit'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
user@server:~$ python3 junos-pyez-get-interface-names.py <configuration changed-seconds="1544032801" changed-localtime="2018-12-05 10:00:01 PST"> <interfaces> <interface> <name>ge-1/0/0</name> </interface> <interface> <name>ge-1/0/1</name> </interface> <interface> <name>lo0</name> </interface> <interface> <name>fxp0</name> </interface> </interfaces> </configuration>
L’exemple suivant récupère la sous-arborescence de l’interface ge-1/0/1 :
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: filter = '<interfaces><interface><name>ge-1/0/1</name></interface></interfaces>' data = dev.rpc.get_config(filter_xml=filter, options={'inherit':'inherit'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
user@server:~$ python3 junos-pyez-get-single-interface.py <configuration changed-seconds="1544032801" changed-localtime="2018-12-05 10:00:01 PST"> <interfaces> <interface> <name>ge-1/0/1</name> <description>customerA</description> <disable/> <unit> <name>0</name> <family> <inet> <address> <name>198.51.100.1/24</name> </address> </inet> </family> </unit> </interface> </interfaces> </configuration>
Spécifiez le format des données de configuration à renvoyer
Le RPC Junos PyEZ get_config()
appelle l’opération de protocole <get-configuration>
Junos XML, qui peut renvoyer des données de configuration Junos OS sous forme d’éléments XML Junos, d’instructions de configuration CLI, de commandes Junos OS set
ou de notation d’objet JavaScript (JSON). Par défaut, le RPC renvoie les get_config()
données de configuration au format XML.
Pour spécifier le format dans lequel renvoyer les données de configuration, l’application Junos PyEZ inclut le options
dictionnaire with 'format':'format'
dans la liste des get_config()
arguments. Pour demander des instructions de configuration CLI, des commandes Junos OS set
ou le format JSON, définissez la format
valeur sur text
, set
ou json
, respectivement.
Comme dans les sessions de protocoles XML NETCONF et Junos, Junos PyEZ renvoie les données de configuration au format attendu, dans l’élément XML approprié pour ce format. La réponse RPC inclut les données de configuration aux formats XML, texte ou set
de commande dans <configuration>
les éléments , <configuration-text>
et , respectivement <configuration-set>
.
from jnpr.junos import Device from lxml import etree from pprint import pprint with Device(host='router1.example.net') as dev: # XML format (default) data = dev.rpc.get_config() print (etree.tostring(data, encoding='unicode', pretty_print=True)) # Text format data = dev.rpc.get_config(options={'format':'text'}) print (etree.tostring(data, encoding='unicode', pretty_print=True)) # Junos OS set format data = dev.rpc.get_config(options={'format':'set'}) print (etree.tostring(data, encoding='unicode', pretty_print=True)) # JSON format data = dev.rpc.get_config(options={'format':'json'}) pprint (data)
En fonction de la version de Python et du format de la sortie, vous devrez peut-être modifier l’instruction print pour afficher une sortie plus lisible par l’homme.
Récupération des données de configuration pour les modèles de données YANG standard ou personnalisés
Vous pouvez charger des modules YANG standardisés ou personnalisés sur des équipements Junos pour ajouter des modèles de données qui ne sont pas pris en charge en mode natif par Junos OS, mais qui peuvent l’être par la traduction. Vous configurez des modèles de données non natifs dans la configuration candidate à l’aide de la syntaxe définie pour ces modèles. Lorsque vous validez la configuration, les scripts de traduction du modèle de données traduisent ces données et valident la configuration Junos OS correspondante en tant que modification temporaire de la configuration d’extraction.
Les configurations candidate et active contiennent les données de configuration des modèles de données YANG non natifs dans la syntaxe définie par ces modèles. Les applications Junos PyEZ peuvent récupérer les données de configuration pour les modèles de données YANG standard et personnalisés, en plus de récupérer la configuration Junos OS native en incluant les arguments appropriés dans le get_config()
RPC. Par défaut, les données de configuration non natives ne sont pas incluses dans la get_config()
réponse RPC.
Pour récupérer les données de configuration définies par un modèle de données YANG non natif en plus de récupérer la configuration de Junos OS, exécutez le get_config()
RPC avec l’argument model
et incluez l’argument namespace
le cas échéant. L’argument model
prend l’une des valeurs suivantes :
custom
: récupère les données de configuration définies par les modèles de données YANG personnalisés. Vous devez inclure l’argument lors de lanamespace
récupération des données pour les modèles de données YANG personnalisés.ietf
: récupère les données de configuration définies par les modèles de données IETF YANG.openconfig
: récupère les données de configuration définies par les modèles de données YANG OpenConfig.True
—Récupérez toutes les données de configuration, y compris la configuration complète de Junos OS et les données de n’importe quel modèle de données YANG.
Si vous spécifiez la ietf
valeur ou openconfig
de l’argument model
, Junos PyEZ utilise automatiquement l’espace de noms approprié. Si vous récupérez des données pour un modèle de données YANG personnalisé à l’aide de model='custom'
, vous devez également inclure l’argument namespace
avec l’espace de noms correspondant.
Si vous incluez l’argument model
avec la valeur custom
, ietf
ou openconfig
et incluez également l’argument filter_xml
pour renvoyer une sous-arborescence XML spécifique, Junos OS renvoie uniquement la hiérarchie correspondante à partir du modèle de données non natif. Si la configuration de Junos OS contient une hiérarchie du même nom, par exemple « interfaces », elle n’est pas incluse dans la réponse. L’option filter_xml
n’est pas prise en charge lors de l’utilisation de model=True
.
Dans l’exemple suivant, le get_config()
RPC récupère la hiérarchie de configuration OpenConfig bgp
à partir de la configuration candidate sur l’appareil. Si vous omettez l’argument filter_xml
, le RPC renvoie les configurations candidates complètes de Junos OS et OpenConfig.
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='bgp', model='openconfig') print (etree.tostring(data, encoding='unicode', pretty_print=True))
Le RPC suivant récupère la interfaces
hiérarchie de configuration à partir de la configuration candidate pour un modèle de données IETF YANG :
data = dev.rpc.get_config(filter_xml='interfaces', model='ietf') print (etree.tostring(data, encoding='unicode', pretty_print=True))
Le RPC suivant récupère la l2vpn
hiérarchie de configuration à partir de la configuration candidate pour un modèle de données YANG personnalisé avec l’espace de noms donné :
data = dev.rpc.get_config(filter_xml='l2vpn', model='custom', namespace='http://yang.juniper.net/customyang/demo/l2vpn') print (etree.tostring(data, encoding='unicode', pretty_print=True))
Le RPC suivant récupère la configuration candidate complète de Junos OS, ainsi que les données de configuration des autres modèles de données YANG ajoutés au périphérique :
data = dev.rpc.get_config(model=True) print (etree.tostring(data, encoding='unicode', pretty_print=True))
Spécifier des options RPC supplémentaires
Lorsque vous utilisez le RPC Junos PyEZ get_config()
pour récupérer la configuration, il appelle l’opération de protocole <get-configuration>
XML Junos. Le RPC prend en charge l’argument options
, ce qui vous permet d’inclure un dictionnaire de paires clé/valeur de tous les attributs pris en charge par l’opération <get-configuration>
. Pour obtenir la liste complète des attributs pris en charge par l’opération de protocole <get-configuration>
XML Junos, reportez-vous à la section <get-configuration>.
Par exemple, le get_config()
RPC récupère les données de la configuration pré-héritage, dans laquelle les <groups>
balises , <apply-groups>
, <apply-groups-except>
et <interface-range>
sont des éléments distincts dans la sortie de configuration. Pour récupérer des données à partir de la configuration post-héritage, qui affiche les instructions héritées de groupes et de plages définis par l’utilisateur en tant qu’enfants des instructions héritières, vous pouvez inclure l’argument options
avec 'inherit':'inherit'
.
Par exemple, le code suivant récupère la configuration au niveau de la [edit system services]
hiérarchie à partir de la configuration candidate post-héritage. Dans ce cas, si la configuration contient également des instructions configurées au niveau de la [edit groups global system services]
hiérarchie, ces instructions sont héritées sous la [edit system services]
hiérarchie dans la configuration postérieure à l’héritage et renvoyées dans les données de configuration récupérées.
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='system/services', options={'inherit':'inherit'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
Comment gérer les espaces de noms dans les données de configuration
Par défaut, le RPC Junos PyEZ get_config()
supprime tous les espaces de noms dans les données de configuration renvoyées. Les applications Junos PyEZ peuvent conserver l’espace de noms dans les données de configuration renvoyées, ce qui vous permet de charger à nouveau les données sur un périphérique, par exemple lorsque vous souhaitez modifier rapidement la configuration existante.
Pour conserver les espaces de noms dans les données de configuration, incluez l’argument remove_ns=False
dans la liste des get_config()
arguments. Par exemple :
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='bgp', model='openconfig', remove_ns=False) print (etree.tostring(data, encoding='unicode', pretty_print=True))
Dans la sortie tronquée suivante, l’élément <bgp>
conserve l’attribut xmlns
qui définit l’espace de noms :
<bgp xmlns="http://openconfig.net/yang/bgp"> <neighbors> <neighbor> <neighbor-address>198.51.100.1</neighbor-address> <config> <peer-group>OC</peer-group> <neighbor-address>198.51.100.1</neighbor-address> <enabled>true</enabled> <peer-as>64496</peer-as> </config> </neighbor> </neighbors> ...
Si l’argument get_config()
remove_ns=False
est omis, l’espace de noms n’est pas inclus dans la sortie.
<bgp> <neighbors> <neighbor> <neighbor-address>198.51.100.1</neighbor-address> <config> <peer-group>OC</peer-group> <neighbor-address>198.51.100.1</neighbor-address> <enabled>true</enabled> <peer-as>64496</peer-as> </config> </neighbor> </neighbors> ...