Certo dia, no trabalho, estava pesquisando no Google por um script que automatizasse a tarefa de extrair as configurações dos elementos de rede de tempos em tempos e as armazenasse em um servidor para consultas futuras. Depois de entrar em alguns sites, acabei encontrando exatamente o que eu procurava no site LinuxQuestions.org. Testei o script em nossa rede e funcionou perfeitamente. Compartilho aqui, com vocês, o dito-cujo:
#!/bin/bash +++++++++++++++++++++++++++++ # Name: cisco_tftp_backup # Author: Steve Cowles # # Revision: Created 10/1/2005 SWC # Revision: 03/26/06 - SWC # Added capability to save config data by date. # # Description: Shell Script to backup cisco startup-config files # using tftp and store in pre-defined directory structure # # Directory structure for script is: # base_dir /backup/cisco/{date} # device type /router # hostname /r1 # filename startup-config # hostname /r2 # filename startup-config # device type /switch # hostname /s1 # filename startup-config # hostname /s2 # filename startup-config # # 10.1.100.201 is the IP address of the system running this script # nvram:startup-config is the only file allowed to be copied +++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++ # Error handlers error_no_tftp_exec () { echo "ERROR - Filename '$1' does not exist" exit } error_no_backup () { echo "ERROR - Unable to backup Host '$1'" } error_zero_length () { echo "ERROR - Hostname '$1' backup has a zero size" } +++++++++++++++++++++++++++++ # If tftp executable does not exist... then exit CMD=tftp ; TFTP=`which ${CMD} 2>/dev/null` [ ! -x "${TFTP}" ] && error_no_tftp_exec ${CMD} +++++++++++++++++++++++++++++ # Variable Section, edit below to meet requirements +++++++++++++++++++++++++++++ # Define/load a variable to store the device information # of all routers/switches to backup using tftp. # # Values are separated by colons (:) # Value 1 = Device Type (sub-dir created) # Value 2 = Device Hostname (sub-dir created) # Value 3 = Device IP address DEVICES=" router:allar1:10.100.12.1 switch:allsw1:10.100.12.2 router:lewar1:10.100.16.1 switch:lewsw1:10.100.16.2 " # Should an error occur during execution, e-mail # errors to following person. i.e. If run as cronjob MAILTO="[email protected]" # Define the base directory where you want to store # files retreived from all devices. All subordinate # directories will created relative to this base BASELOG=/var/log/cisco_configs BASEDIR=${BASELOG}/`date +%m.%d.%y` # Define the filename to (get) from device using tftp # See note 1 above FILENAME=startup-config +++++++++++++++++++++++++++++ # END Variable Section, No servicable parts below +++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++ # Begin Executable Section (do NOT edit below) +++++++++++++++++++++++++++++ # If base directory does not exist, create it [ ! -d ${BASEDIR} ] && mkdir ${BASEDIR} # Update the symbolic link to point to the current # BASEDIR directory if [ -d ${BASELOG} ] ; then # Router link rm ${BASELOG}/router ln -s ${BASEDIR}/router ${BASELOG}/router # Switch link rm ${BASELOG}/switch ln -s ${BASEDIR}/switch ${BASELOG}/switch fi +++++++++++++++++++++++++++++ # Setup loop for each device listed in $DEVICES variable +++++++++++++++++++++++++++++ for device in $DEVICES ; do # Separate DEVICE TYPE/HOSTNAME/IP into separate varaibles DEVICE=`echo ${device} | cut -d ':' -f 1` HOSTNAME=`echo ${device} | cut -d ':' -f 2` IP=`echo ${device} | cut -d ':' -f 3` # Set and Create the sub-directories to store files SUBDIR=${BASEDIR}/${DEVICE} [ ! -d ${SUBDIR} ] && mkdir ${SUBDIR} [ ! -d ${SUBDIR}/${HOSTNAME} ] && mkdir ${SUBDIR}/${HOSTNAME} # Set the fullpath to store file retreived during tftp FULLPATH=${SUBDIR}/${HOSTNAME}/${FILENAME} # tftp $FILENAME from device/IP to directory/FULLPATH ${TFTP} $IP -c get ${FILENAME} ${FULLPATH} >/dev/null 2>&1 || error_no_backup ${HOSTNAME} # Since tftp return values don't seem to include zero length # gets, test for this condition [ ! -s ${FULLPATH} ] && error_zero_length ${HOSTNAME} done
Destaquei em amarelo onde a lista com os elementos e seus IPs deve ser incluída.
PS: Não se esqueça que é preciso liberar, nos elementos de rede Cisco, o acesso do servidor de backup. Isso pode ser feito via exemplo abaixo:
access-list 55 remark PERMIT hosts requesting TFTP access access-list 55 permit host 10.1.100.201 tftp-server nvram:startup-config 55
Onde 10.1.100.201 é o endereço IP do servidor. No exemplo, o script vai buscar a startup-config. Mas ele pode ser facilmente alterado para buscar a running-config ou outro arquivo.
Abaixo, um exemplo do que ele faz, usando o nosso servidor de teste:
[marcoaf@server tftp]$ ls 08.17.10 08.21.10 08.25.10 08.29.10 09.02.10 09.06.10 08.18.10 08.22.10 08.26.10 08.30.10 09.03.10 09.07.10 08.19.10 08.23.10 08.27.10 08.31.10 09.04.10 09.08.10 08.20.10 08.24.10 08.28.10 09.01.10 09.05.10 [marcoaf@server tftp]$ cd 09.05.10/ [marcoaf@server 09.05.10]$ ls acs firewall router switch [marcoaf@server 09.05.10]$ cd router/ [marcoaf@server router]$ ls ROTEADOR01 ROTEADOR02 ROTEADOR03 ROTEADOR04 [marcoaf@server router]$ cd ROTEADOR02 [marcoaf@server ROTEADOR02]$ ls running-config
Tudo organizado por data e tipo de elemento. Para que o script funcione, você deve torná-lo executável no Linux e incluí-lo no CRONTAB para rodar no intervalo que você quiser.
14 comentários
Pular para o formulário de comentário
Marco,
Muito interessante esse scritp, assim que montar um lab vou testa-lo.
Tenho 2 scrips que nunca utilizei, um colega que me passou e disse que funcionava… rsss, que parece ser interessante tbem. Segue abaixo os scripts:
Primeiro
#!/bin/bash
########################################################
# inventario.sh: conecta aos routers e grava em um arquivo as informacoes
# de CPU, memoria e software dos equipamentos
########################################################
# Caminho para o diretório cisco_adm:
ciscopath=$HOME/cisco-adm
# Data:
tempo=`date +%y%m%d%H%M`
# porta do telnet
porta=23
# percorre o arquivo devicelist e lê o nome do equipamento e seu endereço IP
cat $ciscopath/bd/lista_de_dispositivos | while read rtrname ipaddress pw
do
tempfile=”/tmp/~$rtrname.tmp”
# sequência de comandos para login e execução do comando show version
comando=”$pw\nenable\n$pw\nshow version\nexit\nexit”
# executa os comandos e grava em um arquivo temporário
echo -e $comando | nc $ipaddress $porta > $tempfile
# extrai dados de memoria, modelo e versão de software do router.
memoria=`cat $tempfile | grep “bytes of memory.” | awk ‘{print $8}’`
modelo=`cat $tempfile | grep “bytes of memory.” | awk ‘{print $2}’`
imagem=`cat $tempfile | grep “^System image” | awk ‘{print $5}’`
# grava as informações num arquivo .csv, para ser importado no Excel
echo $modelo,$memoria,$imagem >> $ciscopath/inventarios/inventario_$rtrname–$tempo.csv
# remove o arquivo temporário
rm $tempfile
done
Segundo
#!/bin/bash
########################################################
# netshow.sh: grava configuracao, logging e show verion em um arquivo
#
########################################################
# Caminho para o diretório cisco_adm:
ciscopath=$HOME/cisco-adm
# Data:
tempo=`date +%y%m%d%H%M`
# porta do telnet
porta=23
# percorre o arquivo devicelist e lê o nome do equipamento e seu
# endereço IP
cat $ciscopath/bd/lista_de_dispositivos | while read rtrname ipaddress pw
do
# sequência de comandos para login nos routers e execução dos comandos # show running-config, show version e show logging
comando=”$pw\nenable\n$pw\nterm len 0\n show running-config\nshow version\nshow logging\nexit\nexit\n”
# executa o comando e grava em um arquivo com o nome do dispositivo
echo -e $comando | nc $ipaddress $porta > $ciscopath/coletas/$rtrname–$tempo–coleta.txt
done
Se vc puder testar e avaliar! E ver se realmente funciona… rsss
Esses tempos estava lendo sobre subversion, achei interessante para criar um servidor de configurações, alterações etc. Pena que ele é mais utilizado na área de desenvolvimento.
Abraços
LYON,
É possivel utilizar SSH para acessar os equipamentos de rede nesse Script ???
Isso seria bem interessante tb.
Ai sim, fomos surpreendidos novamente!
santos_ligeiro, não sei se funciona via ssh. Se conseguir um tempo quero montar um pegueno lab e testar. E talvez até dar uma melhorada no script.
Eu estava com ideia de usar o RANCID pra fazer backup das minhas configuraçoes…a vantagem do rancid que ele ja faz um “diff” da configuracao atual com a ultima configuraçao salva e de manda as mudanças por email….
Mas esse script é bem mais facil neh?!…rsrsrsrs
Autor
Douglas, hoje trocamos o script pelo RANCID. É bem melhor. Mas o script é simples, como vc mesmo disse 😉
Opa!…rsrsrs….é o RANCID me pareceu ser bem bacana…mas nao tive tempo de instala-lo ainda…
quando sai um post sobre ele?….rsrsrsrs
Existe um outro programa que executa comandos no shell linux e espera pela resposta no terminal. De acordo com o que “aparecia” no terminal, ele dá continuidade no script. Eu utilizava uns anos atrás para fazer scripts de backup, mas não me recordo o nome. Se alguém sabe o nome deste software, por favor me informe.
Achei, tava me referindo ao “expect”. Inclusive tem um post sobre ele aqui no blog: http://blog.ccna.com.br/2009/10/24/script-para-automatizar-comandos-em-switches-cisco/
Lyon, esse script que vc mencionou funciona sim, eu utilizo um parecido todos os dias para guardar as minhas configurações. Eu utilizo um programa chamado Cygwin, para rodar isso.
Abraços
Thiago, bom saber que funciona.
Amigos,
Não sendo propriamente um programa/script para backup de equipamentos de rede, é algo que nos permite automatizar o processo.
Chama-se Telnet Scripting Tool e podem encontrá-lo aqui http://support.moonpoint.com/downloads/windows/network/Telnet/tst10.php.
No seguinte artigo podem ver uma breve explicação do funcionamento deste utilitário: http://jerrymannel.com/blog/2008/11/11/telnet-scripting-tool-aka-tst10exe/
Apenas funciona em Windows e suporta Telnet.
Muito bom pata automatizar tarefas que possam ser executadas via Telnet.
Abraço Lusitano
Muito bom o script. Simples e funcional.
Só queria deixar uma dificuldade que tive ao executar este script no linux Debian:
Quando estava executando estava travando..não fazia nada.
Verifiquei rodando o comando na mão: /usr/bin/tftp 10.10.10.1 -c get startup-config
Me aparece a mensage:
usage: tftp host-name [port]
tftp> ?
Então verifiquei que estava usando o pacote tftp-client no meu linux. Após pesquisar, vi que tem que usar o pacote tftp-hpa
Sendo assim executei o comando: apt-get install tftp-hpa
Então o próprio sistema substituiu o tftp-client por tftp-hpa. E assim o scritp rodou perfeitamente! =)
Abraços!
Muito bom , mais conhecimento