Définir des vues pour les tables opérationnelles Junos PyEZ qui analysent les résultats structurés
Les tables opérationnelles (op) Junos PyEZ pour la sortie structurée sélectionnent des données spécifiques à partir de la sortie XML d’un RPC exécuté sur un équipement Junos. Une table est associée à une vue, qui permet d’accéder aux champs des éléments de table et de les mapper aux variables Python définies par l’utilisateur. Vous associez une table à une vue particulière en incluant la view
propriété dans la définition de table, qui prend le nom de la vue comme argument.
A View mappe vos variables définies par l’utilisateur aux éléments XML des éléments de la table sélectionnés. Une vue vous permet d’accéder à des champs spécifiques dans la sortie en tant que variables avec des propriétés pouvant être manipulées en Python. Junos PyEZ gère l’extraction des données dans Python ainsi que toute conversion de type ou normalisation des données. Les clés définies dans la vue doivent être des noms de variables Python valides.
Les vues Junos PyEZ, comme les tables, sont mises en forme à l’aide de YAML. Les vues qui analysent les résultats structurés peuvent inclure un certain nombre de paramètres, qui sont résumés dans le tableau 1.
Voir le nom du paramètre |
Afficher le paramètre |
Description |
---|---|---|
Voir le nom |
– |
Identifiant défini par l’utilisateur pour la vue. |
Éléments de terrain |
|
Réseau associatif, ou dictionnaire, de paires clé-valeur qui mappent les noms de champs définis par l’utilisateur à des expressions XPath qui sélectionnent des éléments dans les éléments de la table. Les noms de champs doivent être des noms de variables Python valides. |
Groupes de terrain |
|
Réseau associatif, ou dictionnaire, de paires clé-valeur qui mappent les noms de champs définis par l’utilisateur à des expressions XPath qui sélectionnent des éléments dans les éléments de la table. Les expressions XPath sont relatives au contexte défini par le paramètre de groupes correspondant. Les noms de champs doivent être des noms de variables Python valides. |
Groupes |
|
Tableau associatif, ou dictionnaire, de paires clé-valeur qui mappent un nom de groupe défini par l’utilisateur à une expression XPath (relative au contexte d’élément de table) qui définit le contexte XPath pour les champs de ce groupe. |
Prenons la table et la vue op Junos PyEZ suivantes, qui sont incluses avec la distribution Junos PyEZ. La table extrait les informations sur l’état opérationnel des interfaces Ethernet sur l’équipement cible.
--- EthPortTable: rpc: get-interface-information args: media: True interface_name: '[afgxe][et]-*' args_key: interface_name item: physical-interface view: EthPortView EthPortView: groups: mac_stats: ethernet-mac-statistics flags: if-device-flags fields: oper: oper-status admin: admin-status description: description mtu: { mtu : int } link_mode: link-mode macaddr: current-physical-address fields_mac_stats: rx_bytes: input-bytes rx_packets: input-packets tx_bytes: output-bytes tx_packets: output-packets fields_flags: running: { ifdf-running: flag } present: { ifdf-present: flag }
Les sections suivantes abordent les différents composants de la vue :
Voir le nom
Le nom View est un identifiant défini par l’utilisateur pour la vue. Vous associez une table à une vue particulière en incluant la view
propriété dans la définition de table et en fournissant le nom de la vue comme argument. Par exemple :
--- EthPortTable: # Table definition view: EthPortView EthPortView: # View definition
Champs (champs)
Vous personnalisez les vues afin qu’elles ne référencent que les éléments nécessaires à partir des éléments de table sélectionnés. Pour ce faire, vous incluez la fields
propriété et un tableau associatif contenant le mappage de noms de champs définis par l’utilisateur avec des expressions XPath qui sélectionnent les éléments souhaités dans l’élément Table. Les noms de champs doivent être des noms de variables Python valides. Les expressions XPath sont relatives au contexte de l’élément de table.
Prenons l’exemple de sortie RPC suivant :
<rpc-reply> <interface-information> <physical-interface> <name>ge-0/3/0</name> <admin-status junos:format="Enabled">up</admin-status> <oper-status>down</oper-status> <local-index>135</local-index> <snmp-index>530</snmp-index> <link-level-type>Ethernet</link-level-type> <mtu>1514</mtu> ... </physical-interface> </interface-information> </rpc-reply>
Si le paramètre Table item
sélectionne des <physical-interface>
éléments dans la sortie, l’expression XPath de chaque champ de la définition View est relative à ce contexte. La définition de la vue suivante mappe chaque nom de champ défini par l’utilisateur à un élément enfant de l’élément <physical-interface>
:
EthPortView: fields: oper: oper-status admin: admin-status mtu: { mtu : int }
Dans le script Python, vous pouvez ensuite accéder à un élément View en tant que propriété variable. Par défaut, chaque élément View possède une name
propriété qui fait référence à la clé qui identifie cet élément de manière unique.
from jnpr.junos import Device from jnpr.junos.op.ethport import EthPortTable with Device(host='router.example.com') as dev: eths = EthPortTable(dev) eths.get() for item in eths: print (item.name) print (item.oper) print (item.admin) print (item.mtu)
Le format du champ détermine le type de la valeur d’un champ. Par défaut, les valeurs de champ sont stockées sous forme de chaînes. Vous pouvez spécifier un type différent pour la valeur du champ dans le mappage de champs. L’exemple suivant définit la valeur de l’élément mtu
comme un entier :
EthPortView: fields: mtu: { mtu : int }
Dans la sortie RPC, certains éléments JUNOs XML ne sont que des éléments vides qui agissent comme des indicateurs. Vous pouvez indiquer explicitement qu’un champ est un indicateur dans le mappage de champs. La valeur de l’élément de champ pour un indicateur est True si l’élément est présent dans la sortie et False si l’élément est absent. L’exemple suivant définit l’élément ifdf-running
comme un indicateur :
EthPortView: fields: mtu: { mtu : int } running: { if-device-flags/ifdf-running : flag }
Vous pouvez également définir la valeur de l’élément de champ sur un booléen à l’aide de la syntaxe suivante :
fieldname: { element-name: (True | False)=regex(expression) }
La valeur de l’élément est évaluée par rapport à l’expression régulière transmise à regex()
. Si la valeur de l’élément correspond à l’expression, la valeur de l’élément de champ est définie sur le booléen défini dans le format. Dans l’exemple suivant, le oper_status_down
champ est défini sur True si la valeur de l’élément oper-status
contient « down » :
oper_status_down: { oper-status: True=regex(down) }
Vous pouvez également utiliser des expressions régulières plus complexes et correspondre à plusieurs valeurs. L’élément de champ suivant est défini sur True si l’adresse de l’élément rt-destination
commence par « 198.51. » :
dc1_route: { rt-destination: True=regex(^198\.51\.) }
L’élément de champ suivant est défini sur True si l’élément contient une no-refresh
valeur dans l’expression régulière.
no_refresh: { no-refresh: 'True=regex(Session ID: 0x0|no-refresh)' }
Groupes (groupes) et groupes de terrain (fields_)
Les groupes fournissent une méthode de raccourci pour sélectionner et référencer des éléments au sein d’un ensemble de nœuds spécifique dans un élément de table.
Dans la sortie RPC suivante, l’élément <if-device-flags>
contient plusieurs éléments enfants correspondant aux valeurs affichées dans le champ dans la Device flags
sortie CLI :
<rpc-reply> <interface-information> <physical-interface> <name>ge-0/3/0</name> ... <if-device-flags> <ifdf-present/> <ifdf-running/> </if-device-flags> ... </physical-interface> </interface-information> </rpc-reply>
Dans la définition View, vous pouvez utiliser la fields
propriété pour accéder aux éléments enfants en fournissant l’expression XPath complète à chaque élément relatif à l’élément table sélectionné. Par exemple, si la définition EthPortTable sélectionne des éléments, le mappage d’éléments <physical-interface>
de champ utilise les expressions XPath suivantes :
EthPortView: fields: present: if-device-flags/ifdf-present running: if-device-flags/ifdf-running
Vous pouvez également créer un groupe qui définit le contexte de l’élément <if-device-flags>
, puis définir des éléments de groupe de champs qui fournissent simplement l’expression XPath par rapport à ce contexte. Vous pouvez définir n’importe quel nombre de groupes dans une définition view.
Pour créer un groupe, incluez la groups
propriété et mappez un nom de groupe défini par l’utilisateur à l’expression XPath qui définit le nouveau contexte. Puis définissez un groupe de champs dont le nom est fields_
suivi du nom du groupe. Le groupe de champs est un tableau associatif contenant le mappage de noms de champs définis par l’utilisateur avec des expressions XPath qui sont désormais relatives au contexte défini dans groups
. Les noms de champs doivent être des noms de variables Python valides.
L’exemple suivant définit le groupe flags
et le groupe de champs fields_flags
correspondant . Le flags
groupe définit le contexte au niveau hiérarchiquephysical-interface/if-device-flags
, et les present
running
champs accèdent respectivement aux valeurs des éléments et ifdf-running
des ifdf-present
éléments.
EthPortView: groups: flags: if-device-flags fields_flags: present: ifdf-present running: ifdf-running
Que vous utilisiez des champs ou des groupes de champs, vous accédez à la valeur de la même manière dans le script Junos PyEZ à l’aide des noms de champs définis par l’utilisateur.