Fazendo backups de devices por SSH com script em expect e bash

Automatizar processos é sempre importante. Não há cabimento que em pleno 2017 pessoas façam processos de backup em empresas de maneira manual (ou pior, que nem exista backup, trabalhando na sorte).

Este post surgiu da necessidade em meu trabalho de rodar comandos de backup em um appliance e copiar esse arquivo de backup gerado para um lugar seguro, que tenha a cópia e segurança. Diferente de equipamentos que tem só configuração em texto plano, como Cisco, Alcatel-Lucent, Datacom por exemplo e que já possuem softwares que fazem essa função, no trabalho usamos o RANCID, dê uma procurada, temos onde trabalho, a solução de wireless Aruba, que o backup é um conjunto de arquivos compactados. Junto com a controller existe um software da própria Aruba para gerenciamento das controladoras que faz backup, chamado AirWave. Mas para fazer backup ela precisa ter acesso a leitura e gravação e por motivos de segurança deixamos o software apenas com leitura, ele ficou exclusivamente para gráficos, relatórios, rastreabilidade de dados, etc. Assim, ficamos sem ter uma solução nativa para realizar backup das controllers. Há quem contrate apenas a solução de access points e controllers, assim este material será bem útil.

As próprias controllers, por SSH ou por browser, possui uma ferramenta manual de backup. Basicamente você loga por SSH e em modo enable você dá o comando backup flash e é gerado dentro da flash da controller o arquivo flashbackup.tar.gzvocê copia o arquivo por scp para um servidor e tem o backup. Qual o problema? ter que fazer isso manualmente, sempre. Assim, procurando uma forma de fazer de forma automatizada e com base em scripts disponíveis que eu adaptei para funcionar corretamente e melhorei para as minhas necessidades nasceram esses scripsts. Deixo claro que fiz para as controllers Aruba, mas você pode fazer para qualquer equipamento que tenha SSH e que você precise realizar um conjunto de comandos e extrair arquivos deste local.

Pra ficar mais didático vou comentar apenas nos scripts, copie eles, salve e dê permissões de execução com chmod +x [nome_do_arquivo]

 

O script CopiaController

#!/usr/bin/expect -f
#Programa de backup da Controller Aruba - modulo copia controller - versao 0.1
#Wagner Bonifacio Leite

#variavel da controller 1
set controller1 "192.168.0.6"

#variavel da controller 2
set controller2 "192.168.0.7"

#variavel do servidor de destino do arquivo
set server "192.168.0.100"

#variavel de data
set data [exec date +%d-%m-%y]

#laco de repeticao para fazer uma controller por vez limitado a duas
for {set c 1} {$c <= 2} {incr c 1} {

#condicional para variavel controller -unica, para laço de repeticao-
if { $c == 1} {

#se variavel verdadeira seta controller 1 como controller
set controller [lindex $controller1 0]
 
 } else {

#senao seta controller 2 como controller
set controller [lindex $controller2 0]

}

#loga SSH na controller
spawn ssh [usuario_da_controller]@$controller
sleep 2
#envia a senha para logar na controller
expect {
"*word:" {send "[senha_da_controller]\r"}
}
sleep 1
#passa a controller para enable mode com o comando enable
expect {
"*>" {send "en\r"}
}
sleep 1
#senha de enable
expect {
"*word:" {send "enable\r"}
}
sleep 1
#comando que gera o backup backup flash
expect {
"#" {send "backup flash\r"}
}
sleep 60 
#envia backup por SCP
expect {
"#" {send "copy flash: flashbackup.tar.gz scp: $server [usuario_do_server] flashbackup$c-$data.tar.gz\r"}
}
sleep 1
expect {
"*word:" {send "[senha_do_server]\r"}
}
sleep 15
#Deleta backup da controller
expect {
"#" {send "delete filename flashbackup.tar.gz\r"}
}
sleep 1
#sai da controller
expect {
"*#" {send "exit\r"}
}
sleep 5
expect {
"*>" {send "exit\r"; exp_continue}
}
}

#roda o script auxiliar para mover da pasta padrao para uma propria para ter snapshots de backup
exec /backup/BackupController/CopiaArquivos.sh >@stdout

#cria o arquivo de log para confirmar que executou todos os scripts
exec /backup/BackupController/Logs.sh >@stdout

#encerra o script
expect eof

E os scrips auxiliares CopiaArquivos.sh e Logs.sh

CopiaArquivos.sh

(lembro que o caminho /backup/BackupController/Controller/ foi criado por mim para a organização dos arquivos, faça a sua escolha)

#!/bin/sh
#Programa de backup da Controller Aruba - modulo copia de arquivos - versao 0.2
#Wagner Bonifacio Leite

#variavel de data
data=$(date +"%d-%m-%y")

#laco de repeticao para fazer a copia um arquivo por vez limitado a dois
for c in 1 2

do
 
 #comando de copia do arquivo da origem padrao do scp para a pasta destino
 cp /home/[usuario_do_server]/flashbackup$c-$data.tar.gz /backup/BackupController/Controller/
 echo "arquivo flashbackup$c-$data.tar.gz copiado para a pasta /backup/BackupController/Controller/"

sleep 3

#comando de deletar arquivo na origem
rm -Rf /home/[usuario_do_server]/flashbackup$c-$data.tar.gz
echo "arquivo flashbackup$c-$data.tar.gz apagado na origem"

done

Logs.sh

#!/bin/sh
#Programa de backup da Controller Aruba - modulo log - versao 0.1
#Wagner Bonifacio Leite

#variavel de data
data1=$(date +"%d-%m-%y")

#grava em arquivo os dados
echo "BACKUP REALIZADO" >> logs/CONTROLLER-$data1.log
echo "DATA - $data1" >> logs/CONTROLLER-$data1.log

E para finalizar a configuração de crontab

No Linux dê o comando crontab -e

Adicione a linha aonde está o script principal, colocarei o que fiz, altere conforme seu uso

00 23 * * * exec /backup/BackupController/CopiaController >> /backup/BackupController/logs/log.txt

Para verificar se está correto a linha no seu cron, dê o comando crontab -l.

No meu caso faz backup todo dia as 23h00, modifique conforme suas necessidades.

Bom, os scripts são esses, espero que quem gerencia controllers Aruba tire proveito e quem precisa de um script para acesso a SSH também tire proveito. Até mais.

 

 


Also published on Medium.