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