Comment utiliser les RPC et les commandes de mode opérationnel dans les scripts d’événements
La plupart des commandes en mode opérationnel Junos OS ont des équivalents XML. Les scripts d’événements peuvent exécuter ces commandes XML sur un équipement local ou distant à l’aide du protocole RPC ( Remote Procedure Call ). Toutes les commandes du mode opérationnel qui ont des équivalents XML sont répertoriées dans la référence du développeur opérationnel de l’API JUNOs XML.
Les scripts SLAX et XSLT exécutent des RPC sur un équipement local ou distant en utilisant les jcs:invoke()
fonctions ou jcs:execute()
d’extension, respectivement. Dans les scripts Python, les RPC sont faciles à exécuter à l’aide des API Junos PyEZ . Chaque instance de la classe PyEZ Device
Junos possède une propriété qui vous permet d’exécuter rpc
n’importe quel RPC disponible via l’API XML Junos. Après avoir établi une session avec un équipement local ou distant, vous pouvez exécuter le RPC en ajoutant la propriété et le nom de la rpc
méthode RPC à l’instance de l’équipement. La valeur de retour est un objet XML commençant par le premier élément sous la <rpc-reply>
balise.
L’utilisation des RPC et des commandes de mode opérationnel dans les scripts d’événements est abordée plus en détail dans les sections suivantes :
Exécution de RPCs sur un équipement local
Dans un script d’événement SLAX ou XSLT, pour exécuter un RPC sur l’équipement local, incluez le RPC dans une déclaration de variable et appelez la jcs:invoke()
fonction d’extension avec la variable RPC comme argument. L’extrait suivant appelle un RPC sur l’équipement local :
Syntaxe XSLT
<xsl:variable name="rpc"> <get-interface-information/> # Junos RPC for the show interfaces command </xsl:variable> <xsl:variable name="out" select="jcs:invoke($rpc)"/> ...
Syntaxe SLAX
var $rpc = <get-interface-information>; var $out = jcs:invoke($rpc);
Dans un script d’événements Python, pour exécuter un RPC sur l’équipement local, créer l’instance à l’aide Device
d’une liste d’arguments vide, et ajouter la propriété, le rpc
nom de la méthode RPC et la liste d’arguments à l’instance de l’équipement.
Syntaxe Python
from jnpr.junos import Device with Device() as jdev: rsp = jdev.rpc.get_interface_information()
Lorsque vous créez l’instance à l’aide Device
d’une liste d’arguments vide pour se connecter à l’équipement local, Junos OS utilise les privilèges d’accès de l’utilisateur configuré au niveau de la [edit event-options event-script file filename python-script-user]
hiérarchie. Si l’instruction python-script-user
est omise, Junos OS utilise les privilèges d’accès de l’utilisateur et du groupe nobody
générique et non privilégié .
Exécution de RPCs sur un équipement distant
Dans un script d’événements SLAX ou XSLT, pour exécuter un RPC sur un équipement distant, incluez d’abord le RPC dans une déclaration de variable et créez un handle de connexion à l’aide de la jcs:open()
fonction d’extension avec les arguments requis pour se connecter à l’équipement distant. Appelez ensuite la fonction d’extension jcs:execute()
et incluez le handle de connexion et la variable RPC comme arguments. Par exemple :
Syntaxe XSLT
<xsl:variable name="rpc"> <get-interface-information/> </xsl:variable> <xsl:variable name="connection" select="jcs:open('198.51.100.1', 'bsmith', 'test123')"/> <xsl:variable name="out" select="jcs:execute($connection, $rpc)"/> <xsl:value-of select="jcs:close($connection)"/> ...
Syntaxe SLAX
var $rpc = <get-interface-information>; var $connection = jcs:open("198.51.100.1", "bsmith","test123"); var $out = jcs:execute($connection, $rpc); expr jcs:close($connection); ...
Dans un script d’événements Python, pour exécuter un RPC sur un équipement distant, créez d’abord une instance Device
qui utilise les arguments requis pour se connecter à l’équipement distant. Ensuite, exécutez le RPC en ajoutant la rpc
propriété ainsi que le nom de la méthode RPC et la liste d’arguments à l’instance de l’équipement.
Syntaxe Python
from jnpr.junos import Device with Device(host='198.51.100.1', user='bsmith', passwd='test123') as jdev: rsp = jdev.rpc.get_interface_information()
Junos OS se connecte et exécute des opérations sur l’équipement distant à l’aide des privilèges d’accès de l’utilisateur spécifié dans la Device()
liste d’arguments, même si un autre utilisateur est configuré pour l’instruction python-script-user
au niveau de la [edit event-options event-script file filename]
hiérarchie.
Pour éviter d’ajouter directement les détails de connexion à distance dans un script d’événement, vous pouvez spécifier les détails d’exécution à distance pour chaque script d’événement qui exécute des RPC sur un équipement distant au niveau de la [edit event-options event-script file filename remote-execution]
hiérarchie. Nous recommandons d’ajouter les détails d’exécution à distance à la configuration plutôt que directement dans le script d’événement, car toutes les informations sont disponibles dans un seul emplacement et la phrase secrète est chiffrée dans la configuration.
Pour chaque équipement distant sur lequel un RPC est exécuté, configurez le nom d’hôte de l’équipement ainsi que le nom d’utilisateur et le mot de passe correspondants.
[edit event-options event-script file filename] remote-execution { remote-hostname { username username; passphrase passphrase; } }
Les noms d’hôte distants, leur nom d’utilisateur et leur mot de passe correspondants, en plus des détails de l’événement, sont transmis comme entrées au script d’événement lorsqu’ils sont exécutés par une stratégie d’événement. Pour plus d’informations sur les détails qui sont transférés au script d’événement, voir Utiliser les détails de l’événement et de l’exécution distante dans les scripts d’événements.
Un script d’événement fait référence aux détails de l’exécution à distance dans la liste d’arguments de la fonction utilisée pour créer la connexion à l’hôte distant. Une fois la connexion établie, le script peut exécuter des RPC sur cet équipement.
Dans les scripts d’événements Python, vous référencez les détails de l’exécution à distance dans la liste d’arguments de l’instance Junos PyEZ Device()
. Le code suivant itère les détails d’exécution à distance de tous les hôtes configurés pour ce script d’événement et se connecte et exécute le même RPC sur chaque hôte.
Syntaxe Python
from junos import Junos_Remote_Execution_Details from jnpr.junos import Device def main() for remote in Junos_Remote_Execution_Details(): hostname = remote.host username = remote.user passphrase = remote.passwd with Device(host=hostname, user=username, passwd=passphrase) as jdev: inv = jdev.rpc.get_interface_information() #process RPC information... if __name__ == "__main__": main()
Dans les scripts SLAX ou XSLT, créez une connexion à l’hôte distant à l’aide de la jcs:open()
fonction et référencez les détails d’exécution à distance dans la liste d’arguments. Par exemple :
Syntaxe XSLT
<xsl:variable name="rpc"> <get-interface-information/> </xsl:variable> <xsl:for-each select="event-script-input/remote-execution-details"> <xsl:variable name="d" select="remote-execution-detail"/> <xsl:variable name="connection" select="jcs:open($d/remote-hostname,$d/username,$d/passphrase)"/> <xsl:variable name="out" select="jcs:execute($connection, $rpc)"/> <xsl:value-of select="jcs:close($connection)"/> ... </xsl:for-each>
Syntaxe SLAX
var $rpc = <get-interface-information>; for-each (event-script-input/remote-execution-details) { var $d = remote-execution-detail; var $connection = jcs:open($d/remote-hostname,$d/username,$d/passphrase); var $out = jcs:execute($connection, $rpc); expr jcs:close($connection); ... }
Pour exécuter un RPC sur un équipement distant, une session SSH doit être établie. Pour que le script établisse la connexion, vous devez soit configurer les informations clés de l’hôte SSH pour l’équipement distant sur l’équipement local sur lequel le script sera exécuté, soit les informations clés de l’hôte SSH pour l’équipement distant doivent exister dans le fichier d’hôtes connus de l’utilisateur exécutant le script. Pour chaque équipement distant sur lequel le RPC est exécuté, configurez les informations clés de l’hôte SSH à l’aide de l’une des méthodes suivantes :
Pour configurer des hôtes SSH connus sur l’équipement local, incluez l’instruction
host
et spécifiez le nom d’hôte et les options de clé d’hôte pour l’équipement distant au niveau de la[edit security ssh-known-hosts]
hiérarchie de la configuration.Pour récupérer manuellement les informations clés de l’hôte
set security ssh-known-hosts fetch-from-server hostname
SSH, demandez à Junos OS de se connecter à l’équipement distant et d’ajouter la clé dans le mode de configuration.user@host# set security ssh-known-hosts fetch-from-server router2 The authenticity of host 'router2 (198.51.100.1)' can't be established. RSA key fingerprint is 30:18:99:7a:3c:ed:40:04:0f:fd:c1:57:7e:6b:f3:90. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'router2,198.51.100.1' (RSA) to the list of known hosts.
Pour importer manuellement les informations clés d’un hôte SSH à partir d’un fichier, utilisez la
set security ssh-known- hosts load-key-file filename
commande du mode de configuration et spécifiez le fichier des hôtes connus.user@host# set security ssh-known-hosts load-key-file /var/tmp/known_hosts Import SSH host keys from trusted source /var/tmp/known_hosts ? [yes,no] (no) yes
L’utilisateur exécutant le script peut également se connecter à l’équipement local, SSH à l’équipement distant, puis accepter manuellement la clé d’hôte, qui est ajoutée au fichier d’hôtes connu de cet utilisateur. Dans l’exemple suivant, la racine est connectée au routeur1. Afin d’exécuter un RPC distant sur routeur2, la clé d’hôte du routeur2 est ajoutée en exécutant la commande du
ssh router2
mode opérationnel et en acceptant manuellement la clé.root@router1> ssh router2 The authenticity of host 'router2 (198.51.100.1)' can't be established. RSA key fingerprint is 30:18:99:7a:3c:ed:40:04:0f:fd:c1:57:7e:6b:f3:90. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'router2,198.51.100.1' (RSA) to the list of known hosts.
Après avoir configuré la clé d’hôte SSH requise et obtenu une poignée de connexion à l’équipement distant, le script d’événement peut exécuter des RPC avec la jcs:execute()
fonction d’extension sur cet équipement distant.
Affichage des balises RPC pour une commande
Vous pouvez afficher les balises RPC XML pour les commandes du mode opérationnel dans la CLI de l’équipement. Pour afficher les balises RPC XML d’une commande, saisissez display xml rpc
après le symbole du canal (| ).
L’exemple suivant affiche les balises RPC de la show route
commande :
user@host> show route | display xml rpc <rpc-reply xmlns:junos="http://xml.juniper.net/junos/10.1I0/junos"> <rpc> <get-route-information> </get-route-information> </rpc> <cli> <banner></banner> </cli> </rpc-reply>
Les scripts SLAX et XSLT peuvent exécuter des RPC à l’aide des balises RPC XML. Les scripts Python doivent convertir les balises RPC et les options de commande dans un format adapté à Python. Pour plus d’informations sur l’utilisation de Junos PyEZ pour exécuter des RPC et sur le mappage des balises RPC à la méthode Et aux arguments de méthode Python correspondants, consultez Utilisation de Junos PyEZ pour exécuter des RPC sur des équipements exécutant Junos OS.
Utilisation des commandes du mode opérationnel dans les scripts d’événements
Certaines commandes de mode opérationnel n’ont pas d’équivalents XML. Les scripts SLAX et XSLT peuvent exécuter des commandes sans équivalent XML à l’aide de l’élément <command>
. Les scripts Python peuvent exécuter ces commandes à l’aide de la méthode Junos PyEZ cli()
définie dans la Device
classe.
Si une commande n’est pas répertoriée dans la référence du développeur opérationnel de l’API XML Junos, la commande n’a pas d’équivalent XML. Une autre façon de déterminer si une commande a un équivalent XML est d’émettre la commande suivie de la | display xml
commande.
user@host> operational-mode-command | display xml
Si la sortie comprend uniquement des éléments de balise comme <output>
, <cli>
et <banner>
, la commande peut ne pas avoir d’équivalent XML. Dans l’exemple suivant, la sortie indique que la commande n’a show host
pas d’équivalent XML :
user@host> show host hostname | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/10.0R1/junos"> <output> ... </output> <cli> <banner></banner> </cli> </rpc-reply>
Pour certaines commandes ayant un équivalent XML, la sortie de la commande piped | display xml
n’inclut pas d’éléments de balise autres que , <cli>
et <banner>
uniquement parce que <output>
la fonctionnalité concernée n’est pas configurée. Par exemple, la show services cos statistics forwarding-class
commande a un équivalent XML qui renvoie la sortie dans la <service-cos-forwarding-class-statistics>
balise de réponse, mais si la configuration n’inclut pas d’instructions au niveau de la [edit class-of-service]
hiérarchie, alors il n’y a aucune donnée réelle à afficher pour la show services cos statistics forwarding-class | display xml
commande. Le résultat est similaire à celui-ci :
user@host> show services cos statistics forwarding-class | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/8.3I0/junos"> <cli> <banner></banner> </cli> </rpc-reply>
C’est pourquoi les informations contenues dans junos XML API Operational Developer Reference sont généralement plus fiables.
Les scripts d’événements SLAX et XSLT peuvent exécuter des commandes qui n’ont pas d’équivalent XML. Utilisez le <command>
, <xsl:value-of>
et <output>
les éléments du script, comme illustré dans l’extrait de code suivant. Cet extrait est développé et entièrement décrit dans Exemple : Afficher les informations de nom d’hôte DNS à l’aide d’un script Op.
<xsl:variable name="query"> <command> <xsl:value-of select="concat('show host ', $hostname)"/> </command> </xsl:variable> <xsl:variable name="result" select="jcs:invoke($query)"/> <xsl:variable name="host" select="$result"/> <output> <xsl:value-of select="concat('Name: ', $host)"/> </output> ...
Les scripts d’événements Python peuvent exécuter des commandes sans équivalent XML à l’aide des API Junos PyEZ. La cli()
méthode définie dans la Device
classe exécute une commande en mode opérationnel et renvoie la sortie au format texte. Par exemple :
from jnpr.junos import Device def main(): with Device() as jdev: res = jdev.cli('show host hostname', warning=False) print (res) if __name__ == "__main__": main()
Vous pouvez également spécifier format='xml'
de renvoyer la sortie formatée en tant qu’éléments XML Junos OS. Pour plus d’informations sur la méthode Junos PyEZ cli
, voir http://junos-pyez.readthedocs.org/en/latest/_modules/jnpr/junos/device.html#Device.cli .