Автоматический BackUP конфигов Mikrotik по SSH+FTP

Итак, у вас в компании есть много филиалов, где в качестве роутера используется Mikrotik. И вот нежданно-негаданно происходит казус — с роутером чтото случилось (пожар, потоп, скачек напруги, молния, админ идиот и тп), и просят подготовить новый. Бывало такое? И что мы делаем в таком случае? …. судорожно пытаемся вспомнить «А че ж там было настроено, а какой там провайдер … а как же узнать настройки» ну и еще много вопросов 🙂
Немного ознакомившись с админкой Mikrotik (с той его частью что доступна по ssh), я понял, что очень многое, если не все!, можно настраивать через ssh, не применяя web интерфейс либо winbox. А раз так, то это дает нам возможность автоматизировать действия по настройке и бекапу Mikrotik роутеров.
Вот роясь в своих древних скриптах, нашел «заготовку» для автоматизации бекапов большого количества однотипных устройств доступных по ssh.
Немного подправил, потестил и предлагаю Вам вот такой скриптик на perl для автоматического полного бекапа настроек Mikrotik.

#!/usr/bin/perl -w

#use strict;
use warnings;
use Net::Ping;
use Net::SSH::Expect;

my @routers = qw(10.100.100.1 10.100.150.1 10.100.200.1);

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
my @abbr = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
my $now_date = "$mday-$abbr[$mon]-$year";

foreach my $router (@routers)
{
 my $p = Net::Ping->new("tcp", 2);
  $p->port_number(scalar(getservbyname("ssh", "tcp")));
        if ( $p->ping( "$router" ) )
           {
            print "Router $router is UP!\n";
#            print " - SSH OK! Trying to connect ...\n";
               my $ssh = Net::SSH::Expect->new (
                   host => "$router",
                   password => 'Mikrotik_Passwkrd',
                   user => 'Mikrotik_Admin',
                   raw_pty => 1,
                   no_terminal => 1,
                   debug => 1,
                   );
                    my $login_output = $ssh->login();
                    my $name = $ssh->exec("system identity print");
                    $name =~ s%\s*$%%g;
                    $name =~ s%\s*name:\ %%g;
                    my $backup_name = "$name\_$now_date";
                        print "Backing UP ....\n";
                        $ssh->exec("system backup save name=$backup_name");
                        print "Upload backupfile over FTP\n";
                        $ssh->exec("tool fetch address=10.250.100.200 src-path=$backup_name\.backup user=for_backup mode=ftp password=FTP_Password dst-path=/for_backup/mikrotiks/$backup_name upload=yes");
                        print "Deleting backup ....\n";
                        $ssh->exec("file print ; file remove $backup_name\.backup ;");
                 $ssh->close();
           }
        else
           {
            print "Router $router is Down!\n";
           }
}

Извините за мой «французский», но perl я сколько не пытаюсь изучить, все времени нехватает … такчто уж простите корявость написания. Исправления и замечания приветствуются!
Итак, что делает данный скрипт:
В цикле проверяет «живость» конкретного роутера из списка роутеров
если жив

  • пробуем соединиться по ssh
  • получаем имя устройства
  • делаем бекап
  • сливаем бекап по FTP
  • удаляем бекап
  • выходим
  • Опробовано, работает!
    Итак, случись что с неким микротиком, конфиг которого сбекапился, нам достаточно подлить готовый бекап на новый девайс и отдать на отправку 🙂
    Enjoy

      • Slava
      • Сентябрь 5th, 2014 7:09дп

      Спасибо, за труды. Как раз возникла такая же задача. Настроил отправку бекапов по e-mail, но как то оно не очень удобно когда несколько устройств сбрасывают всё в один ящик… Этот способ более интересен, можно еще ротацию бекапов устроить на стороне сервера, дабы не переполнять диски.

      • admin
      • Сентябрь 5th, 2014 8:23дп

      @Slava
      Ха! Славка, ты чтоли? Как там Катя??? Да не за что, это только кирпичик, на самом деле я хотел сказать этой статьей что любые операции в mikrotik-е можно автоматизировать, в идеале построить бы какуюто простенькую систему упраления конфигурациями в БД которой хранились бы все настройки с возможностью централизированного менеджмента. По примеру puppet в Linux например, только веб рожу бы еще 🙂

    1. Добавлю.

      Не знаю как вы ранее удаляли файлы на Микротиках, но вашим решением оно не канает.

      Вот моё:
      $ssh->exec(«file remove [find type=backup]»);
      Ну, можно, конечно, find name=$backupFile-$now-date]

      • admin
      • Январь 30th, 2015 3:59пп

      @Nadz Goldman
      К сожалению сейчас уже нет у меня микротиков — не могу проверить. Но данный скрипт 100% рабочий, и бэкапы он за собой удалял. Статья то уже старенькая, может за это время чтото в CLI микротика поменялось???

    1. Трэкбэков пока нет.

    Why ask?