Exemple : Utilisation de Junos PyEZ pour charger des données de configuration à partir d’un fichier
La bibliothèque Junos PyEZ vous permet d’effectuer des tâches opérationnelles et de configuration sur les équipements Junos. Cet exemple utilise l’utilitaire Junos PyEZ jnpr.junos.utils.config.Config
pour charger des données de configuration à partir d’un fichier local sur le serveur de gestion de la configuration sur un périphérique Junos.
Exigences
Cet exemple utilise les composants matériels et logiciels suivants :
Serveur de gestion de la configuration exécutant Python 3.5 ou version ultérieure et Junos PyEZ version 2.0 ou ultérieure
Équipement Junos sur lequel NETCONF est activé et compte d’utilisateur configuré avec les autorisations appropriées
Paire de clés publique/privée SSH configurée pour l’utilisateur approprié sur le serveur et le périphérique Junos
Aperçu
Cet exemple présente une application Python qui utilise l’utilitaire Junos PyEZ Config
pour activer un nouveau script op dans la configuration de l’appareil spécifié. Le fichier junos-config-add-op-script.conf , qui se trouve sur le serveur de gestion de la configuration, contient les données de configuration correspondantes au format texte ASCII.
L’application Python importe la Device
classe, qui gère la connexion avec le périphérique Junos, la classe, qui est utilisée pour apporter des modifications de configuration non structurées sur le périphérique cible, et les Config
exceptions requises du module, qui contient les exceptions rencontrées lors de la jnpr.junos.exception
gestion des périphériques Junos. Cet exemple lie l’instance Config
à l’instance Device
plutôt que de créer une variable autonome pour l’instance de la Config
classe.
Après avoir créé l’instance Device
de l’équipement cible, la open()
méthode établit une connexion et une session NETCONF avec l’appareil. Les Config
méthodes utilitaires verrouillent ensuite la configuration candidate, chargent les modifications de configuration dans la configuration candidate en tant qu’opération load merge
, valident la configuration candidate, puis la déverrouillent.
Le load()
paramètre method path
est défini sur le chemin d’accès au fichier de configuration. Étant donné que l’extension du fichier de configuration indique le format des données de configuration, le format
paramètre est omis de la liste des arguments. Le paramètre merge=True
indique que l’appareil doit effectuer une load merge
opération.
Une fois les opérations de configuration terminées, l’application appelle la close()
méthode pour mettre fin à la session et à la connexion NETCONF. L’application inclut du code pour la gestion des exceptions, telles que LockError
les erreurs qui se produisent lors du verrouillage de la configuration et CommitError
les erreurs qui se produisent pendant l’opération de validation. L’application inclut également du code pour gérer toutes les exceptions supplémentaires qui pourraient se produire.
Configuration
Créer le fichier de données de configuration
Procédure étape par étape
Pour créer le fichier de données de configuration utilisé par l’application Junos PyEZ :
Créez un fichier avec l’extension appropriée en fonction du format des données de configuration, qui dans cet exemple est du texte ASCII.
Incluez les modifications de configuration souhaitées dans le fichier, par exemple :
system { scripts { op { file bgp-neighbors.slax; } } }
Création de l’application Junos PyEZ
Procédure étape par étape
Pour créer une application Python qui utilise Junos PyEZ pour apporter des modifications de configuration sur un périphérique Junos :
Importez tous les modules, classes et objets requis.
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from jnpr.junos.exception import LockError from jnpr.junos.exception import UnlockError from jnpr.junos.exception import ConfigLoadError from jnpr.junos.exception import CommitError
Incluez toutes les variables requises, ce qui, dans cet exemple, inclut le nom d’hôte de l’équipement géré et le chemin d’accès au fichier contenant les données de configuration.
host = 'dc1a.example.com' conf_file = 'configs/junos-config-add-op-script.conf'
Créez une définition de fonction et un
main()
appel de fonction, puis placez les instructions restantes dans la définition.def main(): if __name__ == "__main__": main()
Créez une instance de la
Device
classe et fournissez le nom d’hôte et tous les paramètres requis pour cette connexion spécifique.Ouvrez ensuite une connexion et établissez une session NETCONF avec l’appareil.
# open a connection with the device and start a NETCONF session try: dev = Device(host=host) dev.open() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) return
Liez l’instance
Config
à l’instanceDevice
.dev.bind(cu=Config)
Verrouillez la configuration.
# Lock the configuration, load configuration changes, and commit print ("Locking the configuration") try: dev.cu.lock() except LockError as err: print ("Unable to lock configuration: {0}".format(err)) dev.close() return
Chargez les modifications de configuration et gérez les erreurs éventuelles.
print ("Loading configuration changes") try: dev.cu.load(path=conf_file, merge=True) except (ConfigLoadError, Exception) as err: print ("Unable to load configuration changes: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return
Validez la configuration.
print ("Committing the configuration") try: dev.cu.commit(comment='Loaded by example.') except CommitError as err: print ("Unable to commit configuration: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return
Déverrouillez la configuration.
print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err))
Mettez fin à la session NETCONF et fermez la connexion avec l’appareil.
# End the NETCONF session and close the connection dev.close()
Résultats
Sur le serveur de gestion de la configuration, examinez la demande terminée. Si l’application n’affiche pas le code prévu, répétez les instructions de cet exemple pour corriger l’application.
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from jnpr.junos.exception import LockError from jnpr.junos.exception import UnlockError from jnpr.junos.exception import ConfigLoadError from jnpr.junos.exception import CommitError host = 'dc1a.example.com' conf_file = 'configs/junos-config-add-op-script.conf' def main(): # open a connection with the device and start a NETCONF session try: dev = Device(host=host) dev.open() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) return dev.bind(cu=Config) # Lock the configuration, load configuration changes, and commit print ("Locking the configuration") try: dev.cu.lock() except LockError as err: print ("Unable to lock configuration: {0}".format(err)) dev.close() return print ("Loading configuration changes") try: dev.cu.load(path=conf_file, merge=True) except (ConfigLoadError, Exception) as err: print ("Unable to load configuration changes: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return print ("Committing the configuration") try: dev.cu.commit(comment='Loaded by example.') except CommitError as err: print ("Unable to commit configuration: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err)) # End the NETCONF session and close the connection dev.close() if __name__ == "__main__": main()
Exécuter l’application Junos PyEZ
Exécuter l’application
-
Sur le serveur de gestion de la configuration, exécutez l’application.
user@server:~$ python3 junos-pyez-config.py Locking the configuration Loading configuration changes Committing the configuration Unlocking the configuration
Vérification
Vérification de la configuration
But
Vérifiez que la configuration a été correctement mise à jour sur l’équipement Junos.
Action
Connectez-vous à l’équipement Junos et affichez la configuration, l’historique des validations et les fichiers journaux pour vérifier la configuration et la validation. Par exemple :
user@dc1a> show configuration system scripts op { file bgp-neighbors.slax; }
user@dc1a> show system commit 0 2014-07-29 14:40:50 PDT by user via netconf ...
user@dc1a> show log messages Jul 29 14:40:36 dc1a sshd[75843]: Accepted publickey for user from 198.51.100.1 port 54811 ssh2: RSA 02:dd:53:3e:f9:97:dd:1f:d9:31:e9:7f:82:06:aa:67 Jul 29 14:40:36 dc1a sshd[75843]: subsystem request for netconf by user user Jul 29 14:40:42 dc1a file[75846]: UI_COMMIT: User 'user' requested 'commit' operation (comment: Loaded by example.) Jul 29 14:40:45 dc1a mspd[75888]: mspd: No member config Jul 29 14:40:45 dc1a mspd[75888]: mspd: Building package info Jul 29 14:40:51 dc1a mspd[1687]: mspd: No member config Jul 29 14:40:51 dc1a mspd[1687]: mspd: Building package info Jul 29 14:40:51 dc1a file[75846]: UI_COMMIT_COMPLETED: commit complete
Sens
La configuration et le contenu du fichier journal indiquent que les instructions de configuration correctes ont été correctement configurées et validées sur l’appareil.
Dépannage
- Résoudre les erreurs de délai d’expiration
- Résoudre les erreurs de verrouillage de configuration
- Résoudre les erreurs liées aux changements de configuration
Résoudre les erreurs de délai d’expiration
Problème
Le code Junos PyEZ génère un message RpcTimeoutError ou un message TimeoutExpiredError et ne parvient pas à mettre à jour la configuration du périphérique.
RpcTimeoutError(host: dc1a.example.com, cmd: commit-configuration, timeout: 30)
Le délai d’expiration par défaut d’un RPC NETCONF est de 30 secondes. Des modifications importantes de configuration peuvent dépasser cette valeur, ce qui entraîne l’expiration de l’opération avant que la configuration puisse être téléchargée et validée.
Solution
Pour prendre en charge les modifications de configuration qui peuvent nécessiter un temps de validation plus long que l’intervalle de délai d’expiration par défaut, définissez l’intervalle de délai d’expiration sur une valeur appropriée et réexécutez le code. Pour configurer l’intervalle, définissez la Device
timeout
propriété sur une valeur appropriée ou incluez l’argument timeout=seconds
lorsque vous appelez la commit()
méthode pour valider les données de configuration sur un périphérique. Par exemple :
dev = Device(host="host") dev.open() dev.timeout = 300 ... dev.cu.commit(timeout=360)
Résoudre les erreurs de verrouillage de configuration
Problème
Le code Junos PyEZ génère un message LockError indiquant que la configuration ne peut pas être verrouillée. Par exemple :
LockError(severity: error, bad_element: None, message: configuration database modified)
Une erreur de verrouillage de configuration peut se produire pour les raisons suivantes :
Un autre utilisateur dispose d’un verrou exclusif sur la configuration.
La base de données de configuration partagée contient des modifications non validées.
L’utilisateur qui exécute le code Junos PyEZ n’est pas autorisé à configurer l’équipement.
Solution
Si un autre utilisateur dispose d’un verrou exclusif sur la configuration ou a modifié la configuration, attendez que le verrou soit libéré ou que les modifications soient validées, puis exécutez à nouveau le code. Si la cause du problème est que l’utilisateur ne dispose pas des autorisations nécessaires pour configurer le périphérique, exécutez l’application avec un utilisateur disposant des autorisations nécessaires ou, le cas échéant, configurez le périphérique Junos pour qu’il accorde à l’utilisateur actuel les autorisations nécessaires pour effectuer les modifications.
Résoudre les erreurs liées aux changements de configuration
Problème
Le code Junos PyEZ génère un message ConfigLoadError indiquant que la configuration ne peut pas être modifiée en raison d’un problème d’autorisations.
ConfigLoadError(severity: error, bad_element: scripts, message: permission denied)
Ce message d’erreur peut être généré lorsque l’utilisateur exécutant le code Junos PyEZ est autorisé à modifier la configuration, mais n’est pas autorisé à modifier la partie souhaitée de la configuration.
Solution
Exécutez l’application avec un utilisateur disposant des autorisations nécessaires ou, le cas échéant, configurez le périphérique Junos de manière à ce qu’il accorde à l’utilisateur actuel les autorisations nécessaires pour effectuer les modifications.