Connectez-vous à des équipements Junos à l’aide de Junos PyEZ
RÉSUMÉ Connectez-vous à un périphérique Junos ou à un serveur de consoles connecté à l’aide de différentes méthodes et protocoles de connexion dans une application Junos PyEZ.
Junos PyEZ est un microframework pour Python qui vous permet de gérer les périphériques Junos. Junos PyEZ modélise chaque équipement en tant qu’instance de la classe jnpr.junos.device.Device . Cette Device
classe vous permet de vous connecter à un périphérique Junos à l’aide d’une connexion de console série, telnet ou en établissant une session NETCONF via SSH. En outre, Junos PyEZ prend également en charge la connexion à l’équipement via une connexion telnet ou SSH à un serveur de console. Un serveur de console, également appelé serveur de terminaux, est un périphérique spécialisé qui fournit une connexion réseau au port de console de gestion hors bande d’un périphérique.
Cette rubrique fournit une vue d’ensemble des méthodes de connexion prises en charge par Junos PyEZ et explique comment utiliser les différentes méthodes pour se connecter à un périphérique Junos. Les exemples Junos PyEZ utilisent différentes méthodes d’authentification, mais pour plus d’informations sur l’authentification d’un utilisateur, reportez-vous à la section Authentifier les utilisateurs Junos PyEZ.
Vue d’ensemble des méthodes de connexion
Junos PyEZ vous permet de vous connecter à un équipement Junos à l’aide d’une connexion de console série, telnet ou d’une session NETCONF via SSH. Vous devez utiliser une connexion de console série lorsque vous êtes physiquement connecté au port CONSOLE d’un périphérique. Vous pouvez utiliser telnet ou SSH pour vous connecter à l’interface de gestion de l’appareil ou à un serveur de console connecté au port CONSOLE de l’appareil. En outre, Junos PyEZ prend en charge les connexions SSH sortantes, dans lesquelles l’équipement Junos initie la connexion avec l’application de gestion des clients.
Les équipements nouveaux ou remis à zéro qui ont des configurations d’usine par défaut nécessitent un accès via une connexion à la console. Ainsi, vous pouvez utiliser Junos PyEZ pour configurer initialement un périphérique qui n’est pas encore configuré pour l’accès à distance, soit en utilisant une connexion de console série lorsque vous êtes directement connecté au périphérique, soit en utilisant telnet ou SSH via un serveur de console connecté au périphérique.
Par défaut, Junos PyEZ utilise SSH pour se connecter à un périphérique. Pour spécifier un autre type de connexion, vous devez inclure le mode
paramètre dans la Device
liste des arguments. Pour établir un telnet vers un périphérique, incluez l’argument mode='telnet'
. Pour vous connecter à un périphérique à l’aide d’une connexion de console série, incluez l’argument mode='serial'
. Le Tableau 1 récapitule les méthodes de connexion Junos PyEZ, leurs valeurs par défaut pour certains paramètres, toute configuration requise de Junos OS et la version de Junos PyEZ dans laquelle la prise en charge de cette méthode de connexion a été introduite pour la première fois.
Mode de connexion |
Valeur de l’argument |
Port par défaut |
Configuration requise de Junos OS |
Première version prise en charge de Junos PyEZ |
---|---|---|---|---|
NETCONF sur SSH (par défaut) |
– |
830 |
[edit system services] netconf { ssh; } |
1.0.0 |
Connexion à la console série |
Série |
/dev/ttyUSB0 |
– |
2.0.0 (*nix) 2.4.0 (Windows) |
Telnet vers un équipement Junos |
Telnet |
23 |
[edit system services] telnet; |
2.0.0 |
Telnet via un serveur de console |
Telnet |
23 |
– |
2.0.0 |
SSH via un serveur de console |
– |
22 |
– |
2.2.0 |
SSH sortant |
– |
– |
[edit system services] outbound-ssh { ... } |
2.2.0 |
Avant de pouvoir accéder à l’interface de gestion d’un périphérique à l’aide de telnet ou de NETCONF via SSH, vous devez d’abord activer le service approprié au niveau de la [edit system services]
hiérarchie. Pour plus d’informations, reportez-vous à la section Configurer des nœuds gérés Junos PyEZ. Étant donné que telnet utilise des mots de passe en texte clair (créant ainsi une faille de sécurité potentielle), nous vous recommandons d’utiliser SSH.
Il est de la responsabilité de l'utilisateur d'obtenir les identifiants d'authentification du nom d'utilisateur et du mot de passe d'une manière sécurisée et adaptée à son environnement. Il est recommandé de demander ces informations d’identification d’authentification lors de chaque appel du script, plutôt que de stocker les informations d’identification dans un format non chiffré.
Junos PyEZ prend en charge l’utilisation de gestionnaires de contexte (with
syntaxe ...as
) pour toutes les méthodes de connexion. Lorsque vous utilisez un gestionnaire de contexte, Junos PyEZ appelle automatiquement les open()
méthodes et close()
pour se connecter à l’équipement et s’en déconnecter. Si vous n’utilisez pas de gestionnaire de contexte, vous devez appeler explicitement les open()
méthodes et close()
dans votre application. Nous vous recommandons d’utiliser un gestionnaire de contexte pour les connexions à la console, car le gestionnaire de contexte gère automatiquement la fermeture de la connexion et l’échec de la fermeture de la connexion peut entraîner des résultats imprévisibles.
Présentation des propriétés de connexion Junos PyEZ
Lorsque vous vous connectez à un équipement Junos, Junos PyEZ stocke les informations relatives à la connexion en cours sous forme de propriétés de l’instance Device
. Le Tableau 2 présente les propriétés de connexion disponibles.
Propriété |
Description |
---|---|
|
Booléen spécifiant l’état actuel de la connexion. Retourne |
|
Chaîne spécifiant le nom d’hôte du périphérique auquel l’application est connectée. |
|
Retour booléen |
|
Entier ou chaîne spécifiant le port utilisé pour la connexion. |
|
Chaîne spécifiant le nom du moteur de routage auquel l’application est connectée. |
|
Entier spécifiant la valeur du délai d’expiration RPC en secondes. |
|
Entier représentant le nombre de secondes écoulées depuis le démarrage du moteur de routage actuel. Cette propriété est disponible à partir de la version 2.1.5 de Junos PyEZ. |
|
Chaîne spécifiant l’utilisateur accédant au périphérique Junos. |
Par exemple, après vous être connecté à un appareil, vous pouvez interroger la connected
propriété pour renvoyer l’état actuel de la connexion. A SessionListener
surveille la session et répond aux erreurs de transport en levant une TransportError
exception et en définissant la Device.connected
propriété sur False
.
L’exemple de code suivant imprime la valeur de la connected
propriété après la connexion à un périphérique Junos, puis à nouveau après la fermeture de la session.
from jnpr.junos import Device dev = Device(host='router.example.net') dev.open() print (dev.connected) dev.close() print (dev.connected)
Lorsque vous exécutez le programme, la connected
propriété est renvoyée True
lorsque l’application est connectée à l’appareil et revient False
après la fermeture de la connexion.
user@host:~$ python connect.py True False
Se connecter à un appareil à l’aide de SSH
La classe Junos PyEZ Device
prend en charge l’utilisation de SSH pour se connecter à un périphérique Junos. Vous pouvez établir une session NETCONF via SSH avec l’interface de gestion de l’appareil ou vous pouvez établir une connexion SSH avec un serveur de console directement connecté au port CONSOLE de l’appareil. Le serveur SSH doit être en mesure d’authentifier l’utilisateur à l’aide des mécanismes d’authentification SSH standard, comme décrit dans Authentifier les utilisateurs Junos PyEZ. Pour établir une session NETCONF sur SSH, vous devez également satisfaire aux exigences décrites dans Configurer les nœuds gérés Junos PyEZ.
Junos PyEZ interroge automatiquement le fichier de configuration SSH par défaut à l’adresse ~/.ssh/config, s’il en existe un. Lorsque vous utilisez SSH pour vous connecter à un périphérique Junos ou à un serveur de console connecté au périphérique, Junos PyEZ tente d’abord l’authentification SSH basée sur une clé publique, puis tente l’authentification par mot de passe. Lorsque l’authentification par mot de passe est utilisée, le mot de passe fourni est utilisé comme mot de passe de l’appareil. Lorsque des clés SSH sont utilisées, le mot de passe fourni est utilisé comme mot de passe pour déverrouiller la clé privée. Si la clé privée SSH a une phrase de passe vide, un mot de passe n’est pas nécessaire. Toutefois, les clés privées SSH avec des phrases de passe vides ne sont pas recommandées.
Pour établir une session NETCONF via SSH avec un périphérique Junos et imprimer les informations sur le périphérique dans une application Junos PyEZ à l’aide de Python 3 :
L’exemple de programme dans son intégralité est présenté ici :
import sys from getpass import getpass from jnpr.junos import Device from jnpr.junos.exception import ConnectError hostname = input("Device hostname: ") junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS or SSH key password: ") dev = Device(host=hostname, user=junos_username, passwd=junos_password) try: dev.open() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) sys.exit(1) except Exception as err: print (err) sys.exit(1) print (dev.facts) dev.close()
Vous pouvez également utiliser un gestionnaire de contexte lors de la connexion à l’appareil, qui appelle automatiquement les open()
méthodes and close()
. Par exemple :
import sys from getpass import getpass from jnpr.junos import Device from jnpr.junos.exception import ConnectError hostname = input("Device hostname: ") junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS or SSH key password: ") try: with Device(host=hostname, user=junos_username, passwd=junos_password) as dev: print (dev.facts) except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) sys.exit(1) except Exception as err: print (err) sys.exit(1)
Junos PyEZ permet également à un client de se connecter à un équipement Junos via une connexion SSH à un serveur de console. Dans ce cas, vous devez spécifier les informations d’identification de connexion pour le serveur de console en incluant les cs_user
arguments et cs_passwd
dans la liste des Device
arguments. Lorsque des clés SSH sont utilisées, définissez l’argument cs_passwd
sur la variable contenant la phrase secrète de la clé privée.
Le serveur de consoles se connecte au périphérique Junos via une connexion série, qui peut être lente. Les connexions Junos PyEZ via un serveur de console ont un délai d’expiration de connexion par défaut de 0,5 seconde. Par conséquent, vous devrez peut-être augmenter l’intervalle de délai d’expiration de la connexion en incluant l’argument Device
timeout=seconds
pour laisser suffisamment de temps à l’application cliente pour établir la connexion.
L’exemple Python 3 suivant s’authentifie auprès du serveur de console, puis du périphérique Junos. Le délai d’expiration de la connexion est défini sur six secondes afin que le client dispose de suffisamment de temps pour établir la connexion.
import sys from getpass import getpass from jnpr.junos import Device from jnpr.junos.exception import ConnectError hostname = input("Console server hostname: ") cs_username = input("Console server username: ") cs_password = getpass("Console server or SSH key password: ") junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS password: ") try: with Device(host=hostname, user=junos_username, passwd=junos_password, cs_user=cs_username, cs_passwd=cs_password, timeout=6) as dev: print (dev.facts) except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) sys.exit(1) except Exception as err: print (err) sys.exit(1)
Junos PyEZ interroge automatiquement le fichier de configuration SSH par défaut à l’adresse ~/.ssh/config, s’il en existe un. Toutefois, vous pouvez spécifier un fichier de configuration SSH différent lorsque vous créez l’instance de périphérique en incluant le ssh_config
paramètre dans la Device
liste des arguments. Par exemple :
ssh_config_file = "~/.ssh/config_dc" dev = Device(host='198.51.100.1', ssh_config=ssh_config_file)
Junos PyEZ prend également en charge ProxyCommand, qui vous permet d’accéder à un équipement cible par le biais d’un hôte intermédiaire prenant en charge netcat. Ceci est utile lorsque vous ne pouvez vous connecter à l’équipement cible que via l’hôte intermédiaire.
Pour configurer ProxyCommand, ajoutez les informations appropriées au fichier de configuration SSH. Par exemple :
[user1@server ~]$ cat ~/.ssh/config Host 198.51.100.1 User user1 ProxyCommand ssh -l user1 198.51.100.2 nc %h 22 2>/dev/null
Se connecter à un appareil à l’aide de SSH sortant
Vous pouvez configurer un équipement Junos pour qu’il établisse une connexion TCP/IP avec une application de gestion des clients qui serait bloquée si le client tentait d’établir la connexion (par exemple, si l’équipement se trouve derrière un pare-feu). La outbound-ssh
configuration demande à l’équipement de créer une connexion TCP/IP avec l’application de gestion des clients et de transmettre l’identité de l’appareil. Une fois la connexion établie, l’application de gestion joue le rôle de client et lance la séquence SSH, tandis que le périphérique Junos joue le rôle de serveur et authentifie le client.
Une fois que vous avez configuré et validé le SSH sortant sur le périphérique Junos, celui-ci commence à établir une connexion SSH sortante en fonction de la configuration validée. L’appareil tente à plusieurs reprises de créer cette connexion jusqu’à ce qu’il réussisse. Si la connexion entre l’appareil et l’application de gestion des clients est abandonnée, l’appareil tente à nouveau de créer une connexion SSH sortante jusqu’à ce qu’il réussisse. Cette connexion est maintenue jusqu’à ce que la configuration SSH sortante soit supprimée ou désactivée.
Pour configurer le périphérique Junos pour les connexions SSH sortantes, incluez l’instruction outbound-ssh
au niveau de la [edit system services]
hiérarchie. Dans l’exemple suivant, le périphérique Junos tente d’établir une connexion avec l’hôte au niveau 198.51.100.101 sur le port 2200 :
user@router1> show configuration system services outbound-ssh client nms1 { device-id router1; secret "$9$h1/ceWbs4UDkGD/Cpu1I-Vb"; ## SECRET-DATA services netconf; 198.51.100.101 port 2200; }
Pour établir une connexion avec le périphérique Junos à l’aide de SSH sortant, l’application Junos PyEZ définit l’argument sock_fd
dans le Device
constructeur égal au descripteur de fichier d’une socket existante et omet l’argument host
ou le définit sur None
.
L’exemple Junos PyEZ suivant écoute sur le port TCP configuré les sessions SSH entrantes des équipements Junos. L’application accepte une connexion entrante et récupère le descripteur de fichier de la socket pour cette connexion, qui est utilisé pour la valeur de l’argument sock_fd
. L’application cliente établit la connexion SSH avec l’appareil, collecte et imprime les informations sur l’appareil, se déconnecte de l’appareil et attend d’autres connexions.
import socket from jnpr.junos import Device from jnpr.junos.exception import ConnectError from getpass import getpass from pprint import pprint """ Listen on TCP port 2200 for incoming SSH session with a Junos device. Upon connecting, collect and print the devices facts, then disconnect from that device and wait for more connections. """ def launch_junos_proxy(client, addr): val = { 'MSG-ID': None, 'MSG-VER': None, 'DEVICE-ID': None, 'HOST-KEY': None, 'HMAC': None } msg = '' count = 0 while count < 5: c = client.recv(1) c = c.decode("utf-8") msg += str(c) if c == '\n': count += 1 for line in msg.splitlines(): (key, value) = line.split(': ') val[key] = value print("{}: {}".format(key, val[key])) return client.fileno() def main(): PORT = 2200 junos_username = input('Junos OS username: ') junos_password = getpass('Junos OS password: ') s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('', PORT)) s.listen(5) print('\nListening on port %d for incoming sessions ...' % (PORT)) sock_fd = 0 while True: client, addr = s.accept() print('\nGot a connection from %s:%d' % (addr[0], addr[1])) sock_fd = launch_junos_proxy(client, addr) print('Logging in ...') try: with Device(host=None, sock_fd=sock_fd, user=junos_username, passwd=junos_password) as dev: pprint(dev.facts) except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) if __name__ == "__main__": main()
user@nms1:~$ python3 junos-pyez-outbound-ssh.py Junos OS username: user Junos OS password: Listening on port 2200 for incoming sessions ... Got a connection from 10.10.0.5:57881 MSG-ID : DEVICE-CONN-INFO MSG-VER : V1 DEVICE-ID : router1 HOST-KEY : ssh-rsa AAAAB...0aF4Mk= HMAC : 4e61201ec27a8312104f63bfaf77a4478a892c82 Logging in ... {'2RE': True, 'HOME': '/var/home/user', 'RE0': {'last_reboot_reason': 'Router rebooted after a normal shutdown.', 'mastership_state': 'master', 'model': 'RE-MX-104', 'status': 'OK', 'up_time': '2 days, 6 hours, 22 minutes, 22 seconds'}, 'RE1': {'last_reboot_reason': 'Router rebooted after a normal shutdown.', 'mastership_state': 'backup', 'model': 'RE-MX-104', 'status': 'OK', 'up_time': '2 days, 6 hours, 22 minutes, 12 seconds'}, 'RE_hw_mi': False, 'current_re': ['re0', 'master', 'node', 'fwdd', 'member', 'pfem'], 'domain': 'example.com', 'fqdn': 'router1.example.com', 'hostname': 'router1', ...
Pour plus d’informations sur la configuration du SSH sortant sur les équipements Junos, reportez-vous à la section Configurer le service SSH sortant.
Se connecter à un appareil à l’aide de Telnet
La classe Junos PyEZ Device
prend en charge la connexion à un périphérique Junos à l’aide de telnet, qui fournit un accès non chiffré au périphérique réseau. Vous pouvez effectuer un telnet vers l’interface de gestion de l’appareil ou vers un serveur de console directement connecté au port CONSOLE de l’appareil. Vous devez configurer le service Telnet au niveau de la [edit system services]
hiérarchie sur tous les appareils qui ont besoin d’accéder à l’interface de gestion. L’accès au périphérique par le biais d’un serveur de console vous permet de configurer initialement un périphérique nouveau ou remis à zéro qui n’est pas encore configuré pour l’accès à distance.
Pour utiliser Junos PyEZ pour effectuer un telnet vers un périphérique Junos, vous devez l’inclure mode='telnet'
dans la Device
liste des arguments et, si vous le souhaitez, inclure le port
paramètre permettant de spécifier un port. Lorsque vous spécifiez mode='telnet'
le paramètre, mais que vous omettez le port
paramètre, la valeur port
par défaut est 23. Lorsque l’application se connecte via un serveur de consoles, spécifiez le port par lequel le serveur de consoles se connecte au périphérique Junos.
Pour utiliser Junos PyEZ pour effectuer un telnet vers un équipement Junos et imprimer les informations sur le périphérique dans une application Junos PyEZ à l’aide de Python 3 :
L’exemple de programme dans son intégralité est présenté ici :
import sys from getpass import getpass from jnpr.junos import Device hostname = input("Device hostname: ") junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS password: ") dev = Device(host=hostname, user=junos_username, passwd=junos_password, mode='telnet', port='23') try: dev.open() except Exception as err: print (err) sys.exit(1) print (dev.facts) dev.close()
Vous pouvez également utiliser un gestionnaire de contexte lors de la connexion à l’appareil, qui gère l’ouverture et la fermeture de la connexion. Par exemple :
import sys from getpass import getpass from jnpr.junos import Device hostname = input("Device hostname: ") junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS password: ") try: with Device(host=hostname, user=junos_username, passwd=junos_password, mode='telnet', port='23') as dev: print (dev.facts) except Exception as err: print (err) sys.exit(1)
Dans certains cas, lorsque vous vous connectez à un serveur de console qui émet un message de bannière, vous devrez peut-être appuyer sur Entrée après le message pour accéder à l’invite de connexion. Si une application Junos PyEZ ouvre une session Telnet avec un serveur de consoles qui demande à l’utilisateur d’appuyer sur la touche Entrée après un message de bannière, il se peut que l’application ne reçoive pas l’invite de connexion, ce qui peut entraîner le blocage de la connexion.
À partir de la version 2.6.2 de Junos PyEZ, Junos PyEZ gère automatiquement la bannière du serveur de console. Dans les versions 2.1.0 à 2.6.1 de Junos PyEZ, une application Junos PyEZ peut inclure console_has_banner=True
dans la Device
liste d’arguments pour telnet un serveur de console qui émet un message de bannière.
dev = Device(host=hostname, user=username, passwd=password, mode='telnet', console_has_banner=True)
Lorsque vous incluez l’argument console_has_banner=True
et que l’application ne reçoit pas d’invite de connexion lors de la connexion initiale, l’application attend 5 secondes, puis émet un caractère de nouvelle ligne (\n
) afin que le serveur de console émette l’invite de connexion. Si vous omettez l’argument et que la connexion se bloque, l’application émet à la place le <close-session/>
RPC pour mettre fin à la connexion.
Connexion à un périphérique à l’aide d’une connexion à la console série
La classe Junos PyEZ Device
vous permet de vous connecter à un périphérique Junos à l’aide d’une connexion de console série, ce qui est utile lorsque vous devez initialement configurer un nouveau périphérique ou un périphérique remis à zéro qui n’est pas encore configuré pour l’accès à distance. Pour utiliser cette méthode de connexion, vous devez être physiquement connecté à l’appareil via le port CONSOLE . Pour obtenir des instructions détaillées sur la connexion au port CONSOLE de votre périphérique, reportez-vous à la documentation matérielle de votre périphérique spécifique.
Junos PyEZ prend en charge l’utilisation de gestionnaires de contexte pour les connexions de console série. Nous vous recommandons d’utiliser un gestionnaire de contexte pour les connexions à la console, car le gestionnaire de contexte gère automatiquement l’ouverture et la fermeture de la connexion. Si la connexion n’est pas fermée, les résultats risquent d’être imprévisibles.
Pour utiliser Junos PyEZ afin de vous connecter à un périphérique Junos via une connexion de console série, vous devez l’inclure mode='serial'
dans la Device
liste des arguments et, si vous le souhaitez, inclure le port
paramètre permettant de spécifier un port. Lorsque vous spécifiez mode='serial'
mais omettez le port
paramètre, la valeur port
par défaut est /dev/ttyUSB0
.
Pour vous connecter à un périphérique Junos à l’aide d’une connexion de console série, et également charger et valider une configuration sur le périphérique dans une application Junos PyEZ à l’aide de Python 3 :
L’exemple de programme dans son intégralité est présenté ici :
import sys from getpass import getpass from jnpr.junos import Device from jnpr.junos.utils.config import Config junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS password: ") try: with Device(mode='serial', port='port', user=junos_username, passwd=junos_password) as dev: print (dev.facts) cu = Config(dev) cu.lock() cu.load(path='/tmp/config_mx.conf') cu.commit() cu.unlock() except Exception as err: print (err) sys.exit(1)