суббота, 14 декабря 2019 г.

Бэкап на коленке: утилита expect

Задача: несколько серверов и один комп-архиватор, на котором нужно делать бекап "избранных" файлов. На каждом сервере создаем юзера archiver (ну или какой вам нравиться). В домашнем каталоге у него (на каждом  же сервере) создаем папочку  backup (ну или какое название вам нравиться другое). Также создаем скрипт, который кроном запускается с нужной периодичностью и пакует в эту папку нужный вам контент.
На компе-архиваторе создаем папку backups с подкаталогами у которых имена сопадают  с именами архивируемых серверов. Далее устанавливаем утилиту expect на компе-архиваторе и пишем скрипт такого содержания:

#!/usr/bin/expect -f
set ret [ catch {

array set user {
        server_1        archiver
        server_2        archiver
# etc
        server_n         archiver
}

#можно и без этого абзаца, но вдруг find на серверах находится в разных местах
array set find {
        server_1          /usr/bin/find
        server_2          /usr/bin/find
# etc
        server_n         /usr/bin/find
}

array set ips_passwords {
        server_1          password1 
        server_2          password2 
# etc
        server_n          passwordn
}

set timeout -1

send_user "backup is starting!...\n"
foreach keyip [array name ips_passwords] {
        #
        #Копируем периодические бэкапы на наш комп-архиватор
        spawn /usr/bin/scp $user($keyip)@$keyip:/home/$user($keyip)/backup/* /home/backuper/backups/$keyip
        match_max 100000
        expect  "*?assword*:"
        send -- "$ips_passwords($keyip)\r"
        send -- "\r"   
        expect eof
        #
        #Со следующим абзацем поосторожней. Удаляет в директории, где храняться
        #наши бэкапы файлы старше 5 дней.
        spawn /usr/bin/ssh $user($keyip)@$keyip $find($keyip) /home/$user($keyip)/backup -ctime +5 -exec /bin/rm \{\} \\\;
        match_max 100000
        expect "*?assword*:*"
        send -- "$ips_passwords($keyip)\r"
        send -- "\r"
        expect eof
}
send_user "backup had finished succesfully!\n"

} result ]

set fh [open /home/backuper/Desktop/expect-works w]
puts $fh "Code $ret, Message/Result $::result \n"
close $fh


Нюанс. Сделайте, если еще не делали, логин юзером archiver с вашего компа-архиватора через ssh на каждый сервер. Эту ситуацию (первая сессия ssh archiver@server_x) можно отработать и в скрипте, но тогда код усложниться. А нам нужна проcтота. Не так ли?

Комментариев нет: