Utiliser les tables de configuration Junos PyEZ pour récupérer les données de configuration
Les tables et vues de configuration de Junos PyEZ offrent un moyen simple et efficace d’extraire des informations spécifiques de la base de données de configuration sélectionnée d’un équipement Junos. Après avoir chargé ou importé la définition de table dans votre module Python, vous pouvez récupérer les données de configuration.
Les tables de configuration Junos PyEZ qui spécifient la propriété peuvent uniquement récupérer les get données de configuration. Les tables qui spécifient la propriété peuvent configurer des ressources sur les set équipements Junos et récupérer des données de la même manière que les tables qui spécifient la get propriété.
Pour récupérer des informations à partir d’un périphérique spécifique, vous devez créer une instance Table et l’associer à l’objet Device représentant l’équipement cible. Par exemple :
from jnpr.junos import Device
from myTables.ConfigTables import UserTable
with Device(host='router.example.com') as dev:
users = UserTable(dev)
Les sections suivantes expliquent comment récupérer et manipuler les données :
Récupération des éléments de configuration
La table get ou set la propriété de configuration identifie les données à extraire de la configuration. Par exemple, l’exemple suivant de définition de table extrait des éléments au niveau de la hiérarchie de user configuration [edit system login] :
UserTable:
get: system/login/user
view: UserView
UserView:
fields:
username: name
userclass: class
Vous récupérez les données de configuration dans votre script Python en appelant la get() méthode et en fournissant les arguments souhaités.
from jnpr.junos import Device
from myTables.ConfigTables import UserTable
with Device(host='router.example.com') as dev:
users = UserTable(dev)
users.get()
Si la définition de table inclut le paramètre, vous devez inclure des required_keys paires clé-valeur pour chaque clé requise dans la liste des arguments de méthode get() . La définition de table suivante exige que la liste d’arguments get() de méthode inclue un user argument dont la valeur correspond à la valeur d’un name élément au niveau de la [edit system login user] hiérarchie :
UserTable:
get: system/login/user
required_keys:
user: name
view: UserView
Dans la get() méthode, vous devez inclure la clé requise dans la liste des arguments. Sinon, le code lève une exception ValueError. L'exemple suivant demande les données de configuration pour l'utilisateur nommé 'operator' :
users = UserTable(dev).get(user='operator')
Si le nom de l’argument est composé d’un trait d’union, vous devez remplacer les tirets du nom par des traits de soulignement. La valeur de l’argument, cependant, est une chaîne de caractères et, en tant que telle, peut contenir des traits d’union.
Vous pouvez inclure l’argument method namesonly=True pour renvoyer des get() données de configuration qui contiennent uniquement des clés de nom au niveau hiérarchique spécifié dans la get propriété or set de votre définition de table.
from jnpr.junos import Device
from myTables.ConfigTables import InterfaceTable
with Device(host='router.example.com') as dev:
interfaces = InterfaceTable(dev)
interfaces.get(namesonly=True)
Par exemple, supposons que get est défini pour récupérer les données de configuration au niveau de la interfaces/interface hiérarchie et que vous incluiez l’argument namesonly=True dans la get() méthode lorsque vous récupérez les données dans votre script Junos PyEZ. Dans ce cas, la méthode renvoie uniquement les valeurs des <name> éléments qui sont des enfants directs du niveau hiérarchique interfaces/interface . Les informations contenues dans les éléments frères de l’élément ne sont pas renvoyées, et les <name> données des <name> éléments situés aux niveaux inférieurs de la hiérarchie ne sont pas renvoyées.
Spécifier la base de données de configuration
Par défaut, les tables de configuration Junos PyEZ récupèrent les données de la base de données de configuration candidate. Lorsque vous appelez la get() méthode dans le script Python pour récupérer les données de la table, vous pouvez spécifier que la méthode doit renvoyer les données de la base de données de configuration validée en transmettant l’argument options et en incluant l’élément 'database':'committed' dans le options dictionnaire.
table_options = {'inherit':'inherit', 'groups':'groups', 'database':'committed'}
with Device(host='router.example.com') as dev:
users = UserTable(dev)
users.get(options = table_options)
Spécifier les options d’héritage et de groupe
Vous pouvez contrôler les options d’héritage et de groupe lorsque vous récupérez des données de configuration à l’aide de l’argument options dans la liste des arguments de méthode get() . L’argument options prend un dictionnaire et, par défaut, est défini sur la valeur suivante, qui applique l’héritage et les groupes pour les données de configuration renvoyées :
options = {'inherit': 'inherit', 'groups': 'groups'}
Si vous ne redéfinissez pas l’argument options dans votre script Python, il utilise automatiquement la valeur par défaut.
L’option inherit spécifie la manière dont les données de configuration affichent les instructions définies dans les groupes de configuration et les plages d’interfaces. Par défaut, l’option 'inherit':'inherit' est incluse et les données de configuration englobent les éléments de balise hérités de groupes ou de plages d’interfaces définis par l’utilisateur dans les éléments de balise héritants plutôt que d’afficher les <groups>éléments , <apply-groups>, <apply-groups-except>ou <interface-range> séparément. Pour appliquer l’héritage mais aussi inclure des éléments de balise pour les instructions définies dans le junos-defaults groupe, utilisez 'inherit':'defaults' dans l’argument options .
Pour désactiver l’héritage, définissez la valeur du dictionnaire sur une chaîne vide.
{'inherit':''}
L’inclusion des options et 'groups':'groups' renvoie des 'inherit':'inherit' données de configuration qui indiquent également le groupe de configuration dont les éléments sont hérités. Un élément hérité d’un groupe particulier inclut l’attribut junos:group="source-group" dans sa balise d’ouverture, comme illustré dans l’exemple suivant :
<configuration>
<interfaces>
<interface junos:group="re0">
<name junos:group="re0">fxp0</name>
<unit junos:group="re0">
<name junos:group="re0">0</name>
<family junos:group="re0">
<inet junos:group="re0">
<address junos:group="re0">
<name junos:group="re0">198.51.100.1/24</name>
</address>
</inet>
</family>
</unit>
</interface>
</interfaces>
...
</configuration>
Pour permettre l’accès aux attributs dans la définition de la vue, vous pouvez inclure la syntaxe XPath appropriée dans le mappage des champs. L’exemple suivant définit le ifgroup champ et le mappe à l’attribut junos:group de l’élément de <name> l’interface :
InterfaceTable:
get: interfaces/interface
view: InterfaceView
InterfaceView:
fields:
ifname: name
ifaddress: unit/family/inet/address/name
ifgroup: name/@group
Junos PyEZ fournit également l’opérateur group , qui est une méthode de raccourci pour accéder à l’attribut junos:group d’un élément. L’exemple suivant définit le ifgroup champ, qui est mappé à l’élément name avec l’opérateur group . Lorsque vous accédez ifgroup à l’intérieur de votre script, il fait référence à la valeur de l’attribut junos:group associé à l’élément de <name> l’interface.
InterfaceTable:
get: interfaces/interface
view: InterfaceView
InterfaceView:
fields:
ifname: name
ifaddress: unit/family/inet/address/name
ifgroup: { name : group }
Si un élément n’est pas hérité d’un groupe, la valeur d’un champ qui fait référence à l’attribut group est None.
Accéder aux éléments de la table
Une fois que vous avez récupéré les éléments de configuration, vous pouvez les traiter comme un dictionnaire Python, ce qui vous permet d’utiliser les méthodes de la bibliothèque Python standard pour accéder aux éléments et les manipuler.
Pour afficher la liste des clés de dictionnaire correspondant aux noms des éléments de configuration, appelez la keys() méthode.
users = UserTable(dev).get()
print (users.keys())
['user1', 'readonly']
Vous pouvez vérifier qu’une clé spécifique est présente dans les éléments Table à l’aide de l’opérateur Python in .
if 'readonly' in users:
Pour afficher la liste des champs, ou valeurs, associés à chaque clé, appelez la values() méthode. La values() méthode renvoie une liste de tuples avec les paires nom-valeur pour chaque champ qui a été défini dans la vue.
print (users.values())
[[('username', 'user1'), ('userclass', 'super-user')], [('username', 'readonly'), ('userclass', 'read-only')]]
Pour afficher la liste complète des éléments, y compris les clés et les valeurs, appelez la items() méthode.
print (users.items())
[('user1', [('username', 'user1'), ('userclass', 'super-user')]), ('readonly', [('username', 'readonly'), ('userclass', 'read-only')])]
Parcourir une table
Les tables prennent en charge l’itération, ce qui vous permet de parcourir chaque élément de configuration de la même manière que vous le feriez pour une liste ou un dictionnaire. Il est ainsi facile de formater et d’imprimer rapidement les champs souhaités.
La définition de table suivante extrait les system/login/user éléments des données de configuration :
UserTable:
get: system/login/user
view: UserView
UserView:
fields:
username: name
userclass: class
L’application Junos PyEZ suivante parcourt les user éléments en boucle et imprime le nom et la classe de chaque utilisateur :
from jnpr.junos import Device
from myTables.ConfigTables import UserTable
with Device(host='router.example.com') as dev:
users = UserTable(dev)
users.get()
for user in users:
print("Username is {}\nUser class is {}".format(user.username, user.userclass))
Les username champs et userclass , qui sont définis dans UserView, correspondent aux valeurs des name éléments et class , respectivement, dans les données de configuration. La sortie inclut le nom et la classe de l’utilisateur.
Username is user1 User class is super-user Username is readonly User class is read-only
Bien que UserView définisse un username champ qui correspond à l’élément name , 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. Ainsi, vous pouvez également utiliser user.name dans cet exemple pour référencer la valeur de l’élément name .