| сохранено

H Скрипт для централизованного резервного копирования конфигураций маршрутизаторов Mikrotik на Powershell

После обрастания инфраструктуры большим количеством маршрутизаторов данного производителя встал вопрос бэкапах конфигурации в одно хранилище. Попадались решения скриптов исполняемых на роутерах с выгрузкой на фтп, но это несколько неудобно, т.к. требует настройки скриптов на всех роутерах идентично.

Решил сделать подобное централизовано путем запуска резервного копирования на роутере командой по ssh во временный файл temp.backup и загрузки его по фтп.

#зададим политику сразу, чтобы не вспминать команду при переносе 
Set-ExecutionPolicy remotesigned -scope currentuser
#установка и импорт библиотеки для ssh
Install-Module -Name Posh-SSH 
Import-Module posh-ssh

$curDir = $MyInvocation.MyCommand.Definition | split-path -parent

function bkprtr {
param($ipaddr)

  #тут указываем логин и пароль к роутерам с правами на ftp и ssh. 
  $secpasswd = ConvertTo-SecureString "Ваш_пароль_к_роутеру" -AsPlainText -Force
  $mycreds = New-Object System.Management.Automation.PSCredential ("Ваш_логин_к_роутеру", $secpasswd)
  $error.clear()

  #Подключение по ssh и отправка команды резервного копирования
  New-SSHSession -ComputerName $ipaddr -Credential $mycreds -Force
  Invoke-SshCommand -index 0 -Command "system backup save name temp.backup"
  Get-SSHSession | Remove-SshSession;

  $Cdate=get-date -Uformat %Y%m%d
  $rptpath = "$curDir\backup\$cdate"

  #Создание каталога по дате
  if (!(test-path -path $rptpath)) {new-item -path $rptpath -itemtype directory}

  #скачивание файла
   wget -Uri "ftp://$ipaddr/temp.backup" -OutFile "$rptpath\$ipaddr.backup" -Credential $mycreds

  #вывод ошибок в файл журнала 
  If ($error.count -gt 0) {
	
	get-date | out-file "$curDir\error.log" -append
	$ipaddr  | out-file "$curDir\error.log" -append
	$error   | out-file "$curDir\error.log" -append
	$error.clear()
	}
} 

#обрабатываем файл list.txt построчно
foreach ($ip in gc $curDir\list.txt ){bkprtr($ip)}

Список адресов маршрутизаторов list.txt следует положить в каталог скрипта. Бэкапы будут складываться в папку backup в подкаталог с датой запуска скрипта. Сами бэкапы именуются по адресу маршрутизатора.

Возможно, кому-то пригодится.

upd.
вторая версия без использования промежуточных файлов


#зададим политику сразу, чтобы не вспминать команду при переносе 
Set-ExecutionPolicy remotesigned -scope currentuser
#установка и импорт библиотеки для ssh
Install-Module -Name Posh-SSH 
Import-Module posh-ssh

$curDir = $MyInvocation.MyCommand.Definition | split-path -parent

function bkprtr {
param($ipaddr)

  #тут указываем логин и пароль к роутерам с правами на ftp и ssh. 
  $secpasswd = ConvertTo-SecureString "Ваш_пароль_к_роутеру" -AsPlainText -Force
  $mycreds = New-Object System.Management.Automation.PSCredential ("Ваш_логин_к_роутеру+ct", $secpasswd)
  $error.clear()

$Cdate=get-date -Uformat %Y%m%d
  $rptpath = "$curDir\backup\$cdate"

  #Создание каталога по дате
  if (!(test-path -path $rptpath)) {new-item -path $rptpath -itemtype directory}

  #скачивание файла
  

#Подключение по ssh и отправка команды резервного копирования
  $sshsession=New-SSHSession -ComputerName $ipaddr -Credential $mycreds -Force 
  $ssh = $sshSession | New-SSHShellStream
	start-sleep -s 5
  $ssh.read() | out-null

    $ssh.WriteLine( "export" )
	start-sleep -s 15
	$ssh.read() | sc "$rptpath\$ipaddr.backup"
	$tfileproc=gc "$rptpath\$ipaddr.backup"
	$tfileproc[2..($tfileproc.count-2)]|sc "$rptpath\$ipaddr.backup"
  
  
  Get-SSHSession | Remove-SshSession;
  
  #вывод ошибок в файл журнала 
  If ($error.count -gt 0) {
	
	get-date | out-file "$curDir\error.log" -append
	$ipaddr  | out-file "$curDir\error.log" -append
	$error   | out-file "$curDir\error.log" -append
	$error.clear()
	}
} 

+6
~2800

комментарии (11)

+1
altman ,  
Спасибо, надо попробовать, сейчас настраиваю скрипт на каждом микротике отдельно, централизовано немного удобнее

Надо еще дописать подробное логирование со списком ошибок, если вдруг какой-то бэкап не сделался.
0
Evil_Demon ,  
Здравая мысль, благодарю. Добавил вывод ошибок происшедших в процессе отработки маршрутизатора в файл error.log
0
HomeDimoN ,  
posh-ssh имеет встроенный SFTP, SCP
Get-SCPFile
Get-SFTPFile
0
algerka ,  
Выполняя постоянно бэкап на флэшку маршрутизтора вы быстро исчерпаете её ресурс.
0
Evil_Demon ,  
Черт его знает, старая версия скрипта на bat-файлах у меня с 2015-го года крутилась, все живы) Но если найти возможность делать бэкап на удаленный ресурс, минуя промежуточное сохранение в память маршрутизатора, могло бы получится ещё интереснее.
0
algerka ,  
второй существенный минус system backup это отсутствие возможности сравнения версий.
когда один админ, это может и не так надо, а когда много народу, то как контролировать чего творят другие?
0
krasaval ,  
На хабре был пример работы с коммутатором из PowerShell

Вот рабочий отрывок из него, обернуть в обработчик ошибок и можно будет использовать

$SSHSession = New-SSHSession -ComputerName $SwitchIP -Credential $Cred -Verbose
$ssh = $sshSession | New-SSHShellStream

    $ssh.WriteLine( "export" )
    $ssh.read()
0
OrionfoX ,  
Советую делать резервный конфиг именно через export file=younameconfig
А если пойти дальше, то общий сбор конфигов сетевых устройств можно сделать через Rancid с последующим переносом в git репозиторий
0
algerka ,   * (был изменён)
зачем через export file насиловать файловую систему?
делайте просто export, и считывайте результат с экрана.

на счет rancid, несколько раз пытался его запустить под микротик, ничего не получилось.
в этоге на expect написал свой под различное оборудование, с контролем версий и изменений.
0
avelor ,  
+1, сначала забирал файл (правда по scp, зачем плодить сущности), потом подумал — и просто снимаю текст с экрана. Делал на autoit+plink, бэкаплю не только микротики.

Кстати, сейчас вяло ковыряю на тему централизованного управления (думаю вместо ssh/snmp использовать api, потому что могу). Но может есть изщные готовые решения, пока не начал как обычно велосипед изобретать? Пока попадалось только поделка для ansible с scp+ssh
0
Evil_Demon ,  
спасибо, хорошие идеи.
Добавил скрипт без использования промежуточных файлов.
правда теперь придется добавлять к логину "+сt" для отключения цветов и особенностей терминала.
Посмотрим как будет жить