[PYTHON] Tool zum zentralen Erfassen der Konfiguration des Cisco / Juniper-Routers

Überblick

Ich habe ein Tool erstellt, um die Konfiguration der Router-Gruppe zentral zu erfassen. Das erstellte Tool wird auf github veröffentlicht. https://github.com/taijiji/ConfigCollector

Motivation gemacht

Ich habe es gemacht, weil ich die Konfiguration des verwalteten Routers für alle Geräte sofort herunterladen und mit Git verwalten wollte.

Die ursprüngliche Annahme war, dass ich eine Reihe von Prozessen aus [Router-Listendatei lesen] -> [Zentrale Erfassung der Routerkonfiguration] -> [In Git-Remote-Repository pushen] in ein Tool umwandeln wollte, Git-Management jedoch Basierend auf der Idee, dass es für den Bediener besser ist, dies manuell zu tun, haben wir nur den Teil ausgeschnitten, um die Routerkonfiguration zentral zu erfassen, und daraus ein Tool gemacht. Indem ich mich nur darauf konzentriere, die Routerkonfiguration zu erhalten, ist das Tool selbst einfacher geworden, und daher habe ich das Gefühl, dass es einfacher geworden ist, sich mit anderen Tools zu verbinden.

Werkzeuginstallation

Ich werde es von Github herunterladen.

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

Wechseln Sie in das heruntergeladene Tool-Verzeichnis.

cd ConfigCollector

Installieren Sie die zugehörigen Module mit pip.

pip install -r requirements.txt

Das ist alles zur Vorbereitung.

Verwendung des Tools

Führen Sie für "get_router_config.py" die im JSON-Format erstellten Routerlisteninformationen als Befehlszeilenargument aus.

python get_router_config.py [json file]

Die JSON-Datei der Routerlisteninformationen wird wie folgt beschrieben. Wenn Sie so schreiben, erhalten Sie die Konfiguration für alle Router über 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"
    }
]

Das Betriebssystem des Routers ist nur für diejenigen gedacht, die zur Hand getestet werden können.

Was wird ausgegeben?

Wenn das Tool erfolgreich ausgeführt wird, wird die Konfiguration für jeden Router im Verzeichnis "router_config" gespeichert. Der Dateiname lautet "Router Hostname.txt".

Das Folgende ist das Ergebnis, wenn es mit der obigen Datei "my_router.json" ausgeführt wird.

$ 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)

Schließlich führt der Administrator manuell [git add] -> [git commit] -> [git push] für das gesamte Verzeichnis "router_config" aus, um es mit Github, Gitlab usw. zu verwalten. Sie können die Version verwalten.

Code

Ich werde den Code als Referenz schreiben. Insgesamt ist es nicht so schwierig.

Die SSH + -Informationserfassung an den Router verwendet ein Modul namens Exscript. Expect ist als SSH-Tool bekannt, aber Exscript unterstützt neben Linux / Unix auch IOS, IOS-XR, JunOS, VRP usw. Es ist gewesen. Dies ist praktisch, da Sie die Syntax für den Router bei der Steuerung des Routers nicht separat analysieren müssen.

Eine Datei, die eine JSON-Datei liest und einen Router-Vorgang aufruft

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 + '" !'

Dateien, aus denen die Kontrolle über den Router besteht

Ich rufe hier nur Exscript an.

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

Tool zum zentralen Erfassen der Konfiguration des Cisco / Juniper-Routers
Tool zum Konvertieren der Juniper-Konfiguration
Ergänzung zur Erklärung von vscode
Die Geschichte des Versuchs, den Client wieder zu verbinden
Skript zum Ändern der Beschreibung von Fasta
10 Methoden zur Verbesserung der Genauigkeit von BERT
So überprüfen Sie die Version von Django
Die Geschichte, MeCab in Ubuntu 16.04 zu setzen
Die Geschichte von pep8 wechselt zu pycodestyle
Ich habe ein Tool zum automatischen Sichern der Metadaten der Salesforce-Organisation erstellt