Централизованное резервное копирования Mikrotik через PowerShell

В виду того, что на нынешнем месте работы ресурсов для теста и введения боевого сервера попросту нет, а те что использовались под VM с осью Ubuntu 18.04.5 Server где крутится скрипт по выполнению резервного копирования конфигурацию маршрутизаторов Mikrotik через bash нужны другому проекту. А значит настает пора, да и есть свободное время дабы перенести скрипт на PowerShell и выполнять его с любой Windows системы.

Т.к. у меня дома несколько Mikrotik’ов то скрипт успешно было оттестирован на моих:

  • Ekzhome: Mikrotik RB2011UiAS-2HnD (mipsbe) v6.47
  • Ekzhome1: Mikrotik hAP ac^2 (arm) v6.47
  • Ekzhome2: Mikrotik CRS326-24G-2S+ (arm) v6.47.3

На всех моих Mikrotik используется одна учетная запись

На заметку: Скрипт запускаю в консоли PowerShell которая запущена через "Run as administrator"

Шаг №1: На системе Windows Server 2012 R2 Std устанавливаю редактор notepad++ и создаю в корне диска C: каталога script где размещаю скрипт на PowerShell:

Шаг №2: Скрипт для единичного бекапирования Mikrotikbmikrotikone

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576Set-Executionpolicy unrestricted#Check if out module loadedif (Get-Module -ListAvailable -Name Posh-SSH) { <# do nothing #> }else { Install-Module Posh-SSH} #Каталог расположения бекапов$Letter_Drive = “C:”$BackupFolder = “backup”$BackupPath = $Letter_Drive + “\” + $BackupFolder  #Функция для создания структуры каталоговFunction CheckPath ($Path) { $Path_Exists = Test-Path -Path $Path If ($Path_Exists -eq $False) { New-Item $Path -Type directory }} #Создаем каталог для бекаповCheckPath $BackupPath | Out-Null #Передайте нежелательные результаты команд / вызовов функций#в вызываемой функции через “… | Out-Null”, #а затем просто верните нужную вещь. write-host $BackupPath #Импортирую установленный модульImport-Module Posh-SSH $username = “username”$password = “password”$hostname = “ipaddress”$Port = “22”$fnamebackup = “backup_$(Get-Date -Format HH_mm_dd_MM_yyyy)”$fnamersc = “backup_$(Get-Date -Format HH_mm_dd_MM_yyyy)” $secpassword = ConvertTo-SecureString -String $password -AsPlainText -Force $Cred = New-Object System.Management.Automation.PSCredential ($username, $secpassword) $ssh = New-SSHSession $hostname -AcceptKey -Credential $Cred -ErrorAction Stop -Port 22$outbackup = (Invoke-SSHCommand $ssh -Command “/system backup save name=$fnamebackup dont-encrypt=yes” -EnsureConnection).Output$outrsc = (Invoke-SSHCommand $ssh -Command “export file=$fnamersc” -EnsureConnection).Output #set name mikrotik$mikrotikname = (Invoke-SSHCommand $ssh -Command “/system identity print” -EnsureConnection).Output #Форматируем значение переменной $mikrotikname$fa = $mikrotikname | out-file $BackupPath\name.txt$fb = Get-Content $BackupPath\name.txt -first 1$fc = $fb.Split(“: “)[-1]$fc #Создаем внутри каталога C:\backup каталог с именем Mikrotik,#ключ Force обязателен, т.к. каталог уже есть и каждый последующий день будет тут же$MName = new-item -Path $BackupPath\$fc -Type Directory -Force$MName #Делаем бекапы backup и бекап конфигурации rsc и через ftp забираем их на каталог c:\backup\<mikrotik_name>#А после удаляем с Mikrotikif($outbackup.Trim() -eq “Configuration backup saved”){ $sftp = New-SFTPSession $hostname -AcceptKey -Credential $Cred Get-SFTPFile -SFTPSession $sftp -RemoteFile “/$fnamebackup.backup” -LocalPath “$MName\” -Overwrite Get-SFTPFile -SFTPSession $sftp -RemoteFile “/$fnamersc.rsc” -LocalPath “$MName\” -Overwrite Start-Sleep 2 Remove-SFTPItem -SFTPSession $sftp -Path “/$fnamebackup.backup” -Force Remove-SFTPItem -SFTPSession $sftp -Path “/$fnamersc.rsc” -Force Remove-SFTPSession $sftp }Remove-SSHSession $ssh

Шаг №3: Скрипт для массового бекапирования Mikrotik‘ов: bmikrotikmore

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687Set-Executionpolicy unrestricted #Check if out module loadedif (Get-Module -ListAvailable -Name Posh-SSH) { <# do nothing #> }else { Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force -Confirm Install-Module Posh-SSH} #Текущая дата$CurrentDate = get-date -format dd.MM.yyyy #Каталог расположения бекапов$Letter_Drive = “C:”$BackupFolder = “backup”$BackupPath = $Letter_Drive + “\” + $BackupFolder  #Функция для создания структуры каталоговFunction CheckPath ($Path) { $Path_Exists = Test-Path -Path $Path If ($Path_Exists -eq $False) { New-Item $Path -Type directory }} #Создаем каталог для бекаповCheckPath $BackupPath | Out-Null #Передайте нежелательные результаты команд / вызовов функций#в вызываемой функции через “… | Out-Null”, #а затем просто верните нужную вещь. write-host $BackupPath #Импортирую установленный модульImport-Module Posh-SSH $username = “username”$password = “password”$Port = “22”#$fnamebackup = “backup_$(Get-Date -Format ddMMyyyy)”#$fnamersc = “backup_$(Get-Date -Format ddMMyyyy)”$fnamebackup = “backup_$(Get-Date -Format HH_mm_dd_MM_yyyy)”$fnamersc = “backup_$(Get-Date -Format HH_mm_dd_MM_yyyy)”  function bkprtr {param($ipaddr)$secpassword = ConvertTo-SecureString -String $password -AsPlainText -Force $Cred = New-Object System.Management.Automation.PSCredential ($username, $secpassword) $ssh = New-SSHSession $ipaddr -AcceptKey -Credential $Cred -ErrorAction Stop -Port 22$outbackup = (Invoke-SSHCommand $ssh -Command “/system backup save name=$fnamebackup dont-encrypt=yes” -EnsureConnection).Output$outrsc = (Invoke-SSHCommand $ssh -Command “export file=$fnamersc” -EnsureConnection).Output #set name mikrotik$mikrotikname = (Invoke-SSHCommand $ssh -Command “/system identity print” -EnsureConnection).Output #Форматируем значение переменной $mikrotikname$fa = $mikrotikname | out-file $BackupPath\name.txt$fb = Get-Content $BackupPath\name.txt -first 1$fc = $fb.Split(“: “)[-1]$fc #Создаем внутри каталога C:\backup каталог с именем Mikrotik,#ключ Force обязателен, т.к. каталог уже есть и каждый последующий день будет тут же$MName = new-item -Path $BackupPath\$fc -Type Directory -Force$MName #Делаем бекапы backup и бекап конфигурации rsc и через ftp забираем их на каталог c:\backup\<mikrotik_name>#А после удаляем с Mikrotikif($outbackup.Trim() -eq “Configuration backup saved”){ $sftp = New-SFTPSession $ipaddr -AcceptKey -Credential $Cred Get-SFTPFile -SFTPSession $sftp -RemoteFile “/$fnamebackup.backup” -LocalPath “$MName\” -Overwrite Get-SFTPFile -SFTPSession $sftp -RemoteFile “/$fnamersc.rsc” -LocalPath “$MName\” -Overwrite Start-Sleep 2 Remove-SFTPItem -SFTPSession $sftp -Path “/$fnamebackup.backup” -Force Remove-SFTPItem -SFTPSession $sftp -Path “/$fnamersc.rsc” -Force Remove-SFTPSession $sftp }Remove-SSHSession $ssh}foreach ($ip in gc C:\script\list.txt) {bkprtr($ip)}

А в файл list.txt директории script вносим IP адрес всех Mikrotik'ов для которых хотим сделать резервную копию.

Результат сделанный бекапов моих микротиков:

Результат работы скрипта
Сформированные каталоги под каждый Mikrotik

Шаг №4: Итого данный скрипт был перенесен на рабочее окружение где я работаю, и вся сеть у меня строится на базе маршрутизаторов Mikrotik и он (скрипт) успешно введен в эксплуатацию. К тому же все бекапы у меня хранятся каталоге которые обязательно синхронизируется с персональным облаком на базе Ubuntu 18.04 Server + OwnCloud 10. Об этом вы можете почитать в заметке «Наработки в OwnCloud + BitLocker на рабочем месте»

На заметку: Первый раз запускаю скрипт из «Шаг №2» придется согласиться с

Для продолжения требуется поставщик NuGet

Для взаимодействия с репозиториями на основе NuGet модулю PowerShellGet требуется версия поставщика NuGet «2.8.5.201»

или более новая. Поставщик NuGet должен быть доступен в «C:\Program Files\PackageManagement\ProviderAssemblies» или

«C:\Users\aolloadm\AppData\Local\PackageManagement\ProviderAssemblies». Поставщик NuGet можно также установить,

выполнив команду «Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force». Вы хотите, чтобы модуль

PowerShellGet установил и импортировал поставщик NuGet прямо сейчас?

[Y] Да — Y  [N] Нет — N  [S] Приостановить — S  [?] Справка (значением по умолчанию является «Y»): Y

Ненадежный репозиторий

Идет установка модулей из ненадежного репозитория. Если вы доверяете этому репозиторию, измените его значение

InstallationPolicy, запустив командлет Set-PSRepository. Вы действительно хотите установить модули из «PSGallery»?

[Y] Да — Y  [A] Да для всех — A  [N] Нет — N  [L] Нет для всех — L  [S] Приостановить — S  [?] Справка

(значением по умолчанию является «N»):Y

Ну а далее скрипт успешно отработает и будем мне счастье.

На этом моя задача завершена, у меня есть самолично написанная наработка по централизованному резервному копированию маршрутизаторов Mikrotik. С уважением автор блога Олло Александр aka ekzorchik.