Imaginez que vous devez déployer des dizaines de commutateurs d'accès Cisco du même type à partir de zéro. Une configuration typique comprend un nom d'hôte et un domaine, une passerelle par défaut, des mots de passe, une liste d'utilisateurs, des adresses IP pour les SVI, des numéros de VLAN, des paramètres pour les liaisons montantes, etc. Y entrer à chaque fois avec vos mains est très long et improductif. Bien sûr, vous pouvez créer une configuration typique et la télécharger via (T) FTP, mais, d'une part, elle nécessitera au moins une configuration minimale de la console, et d'autre part, les paramètres de configuration modifiables doivent encore être modifiés. Pour résoudre ces tâches (ainsi que de nombreuses autres), Cisco IOS contient un puissant outil d'automatisation - un interpréteur Tcl intégré (scripts Cisco IOS avec Tcl).
Qu'est-ce que Tcl
Tcl (lisible "tickle", parfois "flowed") est un langage de programmation interprété développé à la fin des années 80 pour être intégré dans des applications console. La gamme de fonctionnalités de Tcl moderne est assez large: ici, il y a un support pour OOP, et des outils avancés d'expression rationnelle, des tableaux dynamiques, etc.
La prise en charge de cette langue est apparue pour la première fois sur la plate-forme Cisco IOS 12.2 (3) T (dans certaines sources, elle est indiquée en 12.3 (2), mais je n'ai pas trouvé de confirmation de cela) et dispose actuellement de plusieurs options:
- Interprète Tcl avec interface en ligne de commande. Il est intégré dans différentes versions de la plate-forme Cisco IOS, y compris IOS XE et XR, et est disponible pour une large gamme d'appareils. Vous permet d'exécuter des commandes Tcl, d'exécuter des scripts prêts à l'emploi sous forme de fichiers, etc. Les appareils qui n'utilisent pas iOS comme système d'exploitation mais, par exemple, Cat OS ou ASA (dans le pare-feu du même nom) ne contiennent pas l'interpréteur de ligne de commande.
- T.N. «Gestionnaire d'événements intégré» ou EEM - un système de suivi des événements qui vous permet de répondre automatiquement à eux en temps réel. Par exemple, surveillez un hôte distant avec une notification par e-mail. Les scripts EEM (applets) sont écrits en Tcl, mais EEM lui-même ne fournit pas de ligne de commande Tcl distincte. Un exemple d'utilisation voir ici . EEM est disponible sur les plates-formes Nexus (NX OS) et ASA à partir de la version 9.2 (1) et supérieure.
- Systèmes de menu vocal IVR (Interactive Voice Responce).
Comment déterminer la présence d'un interpréteur de commandes connaissant le modèle d'appareil ou la version d'iOS? Il existe un
navigateur de fonctionnalités Cisco pour cela :

L'élément de menu
Fonctionnalités de recherche vous permet de sélectionner une version IOS spécifique pour une version de train IOS donnée ou une plate-forme matérielle spécifique. L'élément de menu
Research Software vous permet de trouver toutes les versions d'iOS avec prise en charge Tcl pour un matériel donné. Nous cliquons, filtrons le champ Filtrer par par le nom (nom de la fonctionnalité) «Scripting Cisco IOS avec Tcl» (ou simplement «Tcl»), ajoutons le nom de la fonctionnalité à la liste, sélectionnez Train release et obtenez une liste de toutes les versions IOS contenant cette fonctionnalité:

Malheureusement, la base de données CFN est incomplète et n'affiche parfois pas toutes les informations. Ainsi, pour la plate-forme CAT2960S, le navigateur a montré la présence de Tcl dans la version IOS 15.2E1 et ne l'a pas montré dans la version 15.2E9, bien qu'en fait l'interpréteur Tcl soit à la fois là et là.
Que peut-on faire dans Cisco IOS en utilisant Tcl? Beaucoup: parcourez et modifiez la configuration, créez des scripts interactifs, opérez sur des objets MIB, des sockets TCP et UDP, et même ...
écrivez un shell web entier!En général, un programme Tcl contient une séquence de commandes séparées par une nouvelle ligne ou un point-virgule. Exemple non explicatif:
puts "Hello, world!"; puts "My first Tcl IOS script!"
Quelques opérateurs:
#
commentaire à la fin de la ligne
set a 1
affectation
set a 1
a = 1
$a
obtenir la valeur d'une variable
{ }
instruction de bloc - définit le corps de la boucle ou de la condition
[ ]
opérateur de substitution - une fois exécuté, au lieu des crochets, la valeur calculée de l'expression qu'ils contiennent sera remplacée
== <= <>
opérateurs de comparaison
puts "text"
affiche la chaîne "texte" dans stdout (c'est-à-dire vers la console)
puts $a
même pour la valeur d'un
gets stdin
lit les valeurs de la console
set a [gets stdin]
saisir une valeur à partir de la console et affecter sa variable a
for {set i 1} {$i < 10} {inrc i} {....}
for loop
proc {argument, ....} {body}
procédure
Pour une liste plus complète, voir
progopedia.ru/language/tclL'interpréteur Tcl est démarré par la commande tclsh du mode EXEC privé:
sw#Tclsh sw(tcl)#
Exécutez le premier script:

Quitter l'interpréteur est la commande
tclquit
ou tout simplement quitter. Tcl est sensible à la casse, donc
Puts "Hello, world"
générera une erreur, mais le registre shell du shell IOS n'est pas important. Toutes les commandes d'entrée sont d'abord traitées par l'interpréteur Tcl, si la commande d'entrée est exécutable avec ainsi de suite. Tcl, il s'exécute et le résultat est envoyé au dispositif TTY. Si la commande ne peut pas être exécutée par l'interpréteur, elle est transmise à l'analyseur de commande IOS. Ainsi, un script peut combiner des instructions Tcl et des commandes IOS. L'environnement IOS ne contient pas d'éditeur de texte à part entière, donc les scripts prédéfinis doivent être créés par des moyens externes et seulement ensuite copiés sur flash ou sur mémoire. Il prend également en charge la précompilation du script en bytecode avec lancement ultérieur. Le lancement du fichier script est exécuté par la commande
tclsh flash:filename
Plusieurs sessions d'interpréteur Tcl de différentes sessions TTY sont autorisées.
Commandes internes de l'interpréteur Tcl:
exec - Exécute la commande citée à partir de l'ensemble EXEC avec privilèges CLI IOS.
sw(tcl)#exec "show int fa0"
:
ios-config - exécute une commande à partir du mode de configuration globale. Derrière elle, dans des guillemets séparés, toutes les commandes de sous-configuration suivantes sont indiquées. Par exemple:
sw(tcl)#ios_config "int fa0" "ip address 192.168.0.1 255.255.255.0" "no shut"
équivalent à une série de commandes iOS:
sw#conf te sw(config)#int fa0 sw(conf-int)#ip address 192.168.0.1 255.255.255.0 sw(conf-int)#no shut
L'interpréteur Tcl empêche les processus exécutés d'interagir directement avec la console. Par conséquent, le transfert de données vers des processus exécutés lancés à partir du shell Tcl se produit à l'aide de la
commande typeahead :
typeahead "y\ny"
exec "reload"
Tout d'abord, deux caractères "y" seront stockés dans le tampon d'entrée, séparés par une nouvelle ligne (\ n), puis la commande reload exec sera lancée, qui lira la commande d'annulation ou de confirmation de réinitialisation du tampon d'entrée et (si nécessaire) enregistrera la configuration.
Le chatouillement ne prend pas en charge la saisie, cela doit être rappelé lors de l'utilisation de variables:

L'opérateur imbriqué
[expr {..}]
calcule la valeur de l'expression spécifiée entre crochets ($ a + $ b) et effectue la substitution de cette valeur au lieu de crochets.
Exemple de procédure en Tcl:
proc ping_net {x} {
for {set n 1} {$n < $x} {incr n} {
exec "ping 192.168.0.$n"
}
}
lorsque vous entrez une accolade, l'interpréteur ne ferme pas la ligne de commande tant que vous n'avez pas entré une paire d'accolades fermantes. La procédure est stockée dans la mémoire de l'interpréteur jusqu'à la fin de la session d'interpréteur avec la commande tclquit. Cela permet de démarrer les procédures et d'accéder aux variables des scripts précédemment lancés. N'oubliez pas qu'une erreur dans le script peut entraîner une boucle et un blocage de votre session (V) TTY! La console ne dispose pas de fonctions d'arrêt d'urgence (telles que Ctrl + Break), la seule façon est de démarrer une nouvelle session et d'
clear line
session «gelée» avec la commande
clear line
.
Passons maintenant à la résolution d'un problème pratique. Devant nous, le Cat2950S à 48 ports est prêt à l'emploi. Le script ci-dessous
- demande à la console le numéro de série du commutateur sw_num
- lui attribue un nom d'hôte de la forme switch_ <sw_num>
- demande et définit un mot de passe pour la console EXEC en mode privé
- configure l'adresse sur son interface de contrôle Fa0 (192.168.0.x) et son interface Vlan1 (10.0.x.254) conformément au numéro de commutateur entré
- crée une réservation DHCP basée sur le port et un pool de 48 adresses, dans lequel une adresse IP est réservée pour chaque client, dont l'octet inférieur est égal au numéro de série du port par lequel ce client est connecté.
puts "Enter Switch number:" set sw_num [gets stdin] ios_config "hostname switch_$sw_num" puts "Enter password (secret):" set pass [gets stdin] ios_config "enable secret 0 $pass" ios_config "line 0 16" "password 0 $pass" "login" ios_config "int fa0" "ip address 192.168.0.$sw_num 255.255.255.0" "no shut" ios_config "int vlan1" "ip address 10.0.$sw_num.254 255.0.0.0" "no shut" ios_config "ip dhcp use subscriber-id client-id" ios_config "ip dhcp subscriber-id interface-name" # 48 subscriber-id for {set i 1} {$i <= 48} {incr i} {ios_config "int Gi1/0/$i" "ip dhcp server use subscriber-id client-id"} ios_config "ip dhcp pool POOL1" "network 10.0.0.0 255.0.0.0" "reserved-only" "default-router 10.10.0.254" # 48 IP-, . for {set i 1} {$i <= 48} {incr i} {ios_config "ip dhcp pool POOL1" "address 10.0.$sw_num.$i client-id Gi1/0/$i ascii"} #
Remarque 1. Il y a une petite erreur logique dans ce script. Essayez de la retrouver.
Remarque 2. Certains éditeurs de texte aiment mettre un caractère EoF non imprimable à la fin du fichier. Il peut être vu dans la console IOS en listant le contenu du fichier avec cat ou plus. Après être tombé sur EoF, l'interpréteur Tcl lancera une erreur et ignorera toute la ligne. Par conséquent, j'ai laissé une marque de commentaire qui s'échappe à la fin du script.
La question se pose: comment puis-je écrire un script dans la mémoire d'un commutateur avec une adresse IP non configurée, fonctionnant uniquement via le port de console? Ne tapez pas le script à la main! Est-il possible de configurer manuellement l'interface de gestion et d'utiliser FTP à chaque fois? Non, cela peut être plus simple. Cisco IOS peut copier des fichiers directement via le port série de la console à l'aide du protocole Xmodem et les enregistrer sur un flash. Pour ce faire, vous avez besoin d'un émulateur de terminal avec prise en charge de Xmodem, par exemple, ZOC ou Tera Term (mais le populaire Putty gratuit, hélas, ne fonctionnera pas!). La copie est effectuée par la commande IOS
copy xmodem: flash: filename , après quoi vous devez effectuer le transfert de fichiers dans le menu de l'émulateur de terminal:

Cela peut également être fait pendant que vous êtes dans ROMmon (par exemple, si vous "détruisez" la configuration du commutateur sans mot de passe EXEC de privilège). Mais la copie de fichiers (de la mémoire flash du commutateur vers le PC) n'est pas prise en charge.
Malheureusement, depuis Tcl, vous ne pouvez pas ouvrir une session telnet sur un routeur distant. En essayant
sw(tclsh)#exec "telnet host"
à l'étape de saisie du mot de passe.
Avec cela, une brève excursion dans les capacités du langage Tcl sur la plate-forme Cisco IOS est terminée; vous pouvez étudier le problème plus en détail dans le document "Cisco IOS Scripting avec TCL Configuration Guide" disponible sur le site Web de Cisco.