[PYTHON] Outil pour acquérir de manière centralisée la configuration du routeur Cisco / Juniper

Aperçu

J'ai créé un outil pour acquérir de manière centralisée la configuration du groupe de routeurs. L'outil créé est publié sur github. https://github.com/taijiji/ConfigCollector

Motivation faite

Je l'ai fait parce que je voulais obtenir la configuration du routeur géré à la fois pour tous les appareils et la gérer avec Git.

L'hypothèse originale était que je voulais transformer une série de processus de [Lire le fichier de liste de routeurs] -> [Acquisition centralisée de la configuration du routeur] -> [Push to Git remote repository] en un outil, mais la gestion Git est Partant de l'idée qu'il vaut mieux que l'opérateur le fasse manuellement, nous n'avons découpé que la partie pour acquérir de manière centralisée la configuration du routeur et en faire un outil. En se concentrant uniquement sur la configuration du routeur, l'outil lui-même est devenu plus simple et, par conséquent, je pense qu'il est devenu plus facile de se lier à d'autres outils.

Installation d'outils

Je vais le télécharger depuis github.

git clone [email protected]:taijiji/ConfigCollector.git

Accédez au répertoire des outils téléchargés.

cd ConfigCollector

Installez les modules associés à l'aide de pip.

pip install -r requirements.txt

C'est tout pour la préparation.

Comment utiliser l'outil

Pour "get_router_config.py", exécutez les informations de liste de routeurs créées au format JSON en tant qu'argument de ligne de commande.

python get_router_config.py [json file]

Le fichier json des informations de la liste de routeurs est décrit comme suit. Si vous écrivez comme ça, vous obtiendrez la configuration de tous les routeurs via SSH.

my_router.json


[
    {
        "hostname" : "router1",
        "username" : "user1",
        "password" : "aaabbbccc",
        "ipv4"     : "192.168.0.1",
        "os"       : "JUNOS"
    },
    {
        "hostname" : "router2",
        "username" : "user2",
        "password" : "aaabbbccc",
        "ipv4"     : "192.168.0.2",
        "os"       : "IOS-XR"
    },
    {
        "hostname" : "router3",
        "username" : "user3",
        "password" : "aaabbbccc",
        "ipv4"     : "192.168.0.3",
        "os"       : "IOS"
    }
]

Le système d'exploitation du routeur est destiné uniquement à ceux qui peuvent être testés à portée de main.

Quelle est la sortie

Si l'outil est exécuté avec succès, la configuration de chaque routeur sera enregistrée dans le répertoire "router_config". Le nom du fichier est "Nom d'hôte du routeur.txt".

Ce qui suit est le résultat lorsqu'il est exécuté avec le fichier "my_router.json" ci-dessus.

$ ls router_config
router1.txt  router2.txt  router3.txt
$ less router_config/router1.txt

show configuration | no-more
## Last commit: 2015-05-01 17:00:00 JST by user1
version 10.x.x;
system {
    host-name router1;
    time-zone Asia/Tokyo;
(snip)

Enfin, l'administrateur exécute manuellement tout le répertoire "router_config" [git add] -> [git commit] -> [git push] pour le gérer avec Github, Gitlab, etc., et configurer le routeur de manière centralisée. Vous pouvez gérer la version.

code

J'écrirai le code pour référence. Dans l'ensemble, ce n'est pas si difficile.

L'acquisition d'informations SSH + vers le routeur utilise un module appelé Exscript. Expect est connu comme un outil SSH, mais Exscript prend en charge IOS, IOS-XR, JunOS, VRP, etc. en plus de Linux / Unix. Ça a été. Ceci est pratique car vous n'avez pas besoin d'analyser la syntaxe séparément pour le routeur lors du contrôle du routeur.

Un fichier qui lit un fichier JSON et appelle une opération de routeur

get_router_config.py


#! /usr/bin/env python
import sys
import traceback
import json

from ssh_router import Router

# Open json input file
try:
    # argument is routers' information with JSON formt.
    input_filename = sys.argv[1]
    input_file = open(input_filename ,'r')
    print 'Reading router info from "' + input_filename + '"...' 
except ( IOError, IndexError):
    print 'Cannot open JSON file.'
    print 'Please use bellow: " python get_router_config [JSON file] " '
    sys.exit()
else:
    router_info_json = input_file.read()
    input_file.close()

# Convert format from json to dictionary_type
try:
    router_info = json.loads(router_info_json)
except ValueError as error:
    print 'JSON format error : '
    print router_info_json
    print error
    sys.exit()

# Login and get config each routers using ssh
for num in range( len(router_info) ):
    router = Router( router_info[num] )
    
    # Login Router
    print 'Accessing router: ' + router_info[num]['hostname'] + '...'
    try:
        router.login()
        router_config = router.get_config()
    except:
        print 'Router login error'
        print router_info[num]
        router.logout()
        sys.exit()

    # Get config of Router
    try:
        router_config = router.get_config()
    except:
        print 'Router get configuration error'
        print router_info[num]
        router.logout()
        sys.exit()
    else:
        router.logout()
    
    # Create output file written config
    try:
        output_filename = 'router_config/' + router_info[num]['hostname'] + '.txt'
        print 'Writing output file "' + output_filename + '"...'
    except AtributeError:
        print 'cannot read dictionary of router_info[' + num + '][hostname]'
        sys.exit()

    try:
        output_file = open ( output_filename, 'w')
    except:
        print 'cannot open "' + output_filename + '"'
        output_file.close
        sys.exit()
    else:
        output_file.write( router_config )
        output_file.close

    print 'Success to create "'  + output_filename + '" !'

Fichiers qui constituent le contrôle du routeur

J'appelle juste Exscript ici.

ssh_router.py


! /usr/bin/env python
# -*- coding: utf-8 -*-

from Exscript.protocols import SSH2
from Exscript.Account import Account

class Router:
    def __init__(self, router_info):
        self.hostname   = router_info['hostname']
        self.username   = router_info['username']
        self.password   = router_info['password']
        self.ipv4           = router_info['ipv4']
        self.os              = router_info['os']

    def login(self):
        self.session = SSH2()
        self.session.connect(self.ipv4)
        self.session.login( Account(name=self.username, password=self.password) )

    def logout(self):
        if self.session :
            self.session.send('exit\r')
            self.session.close()
        else:
            raise AttributeError( 'cannot find a living session.' )

    def get_config(self):
        if( self.os=='IOS-XR' or self.os=='IOS' or self.os=='IOS-XE'):
            self.session.execute('terminal length 0')
            self.session.execute('show running-config')
            result = self.session.response
        elif( self.os == 'JUNOS'):
            self.session.execute('show configuration | no-more')
            result = self.session.response
        else:
            raise ValueError( 'OS is unknown value. Please describe from  JUNOS / IOS / IOS-XE / IOS-XR.' )

        return result

Recommended Posts

Outil pour acquérir de manière centralisée la configuration du routeur Cisco / Juniper
Outil pour convertir la configuration Juniper
Supplément à l'explication de vscode
L'histoire d'essayer de reconnecter le client
Script pour changer la description de fasta
10 méthodes pour améliorer la précision de BERT
Comment vérifier la version de Django
L'histoire de la mise en place de MeCab dans Ubuntu 16.04
L'histoire du changement de pep8 en pycodestyle
J'ai créé un outil pour sauvegarder automatiquement les métadonnées de l'organisation Salesforce