Script para auto-arquivamento das configurações de elementos de rede

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

  1. 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

  2. LYON,

    É possivel utilizar SSH para acessar os equipamentos de rede nesse Script ???
    Isso seria bem interessante tb.

  3. Ai sim, fomos surpreendidos novamente!

  4. 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.

  5. 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

  6. Douglas, hoje trocamos o script pelo RANCID. É bem melhor. Mas o script é simples, como vc mesmo disse 😉

  7. Opa!…rsrsrs….é o RANCID me pareceu ser bem bacana…mas nao tive tempo de instala-lo ainda…

    quando sai um post sobre ele?….rsrsrsrs

  8. 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.

  9. 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/

  10. 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

  11. Thiago, bom saber que funciona.

  12. 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

  13. 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!

  14. Muito bom , mais conhecimento

Deixe um comentário