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