В виду того, что на нынешнем месте работы ресурсов для теста и введения боевого сервера попросту нет, а те что использовались под 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: Скрипт для единичного бекапирования Mikrotik: bmikrotikone

Set-Executionpolicy unrestricted
#Check if out module loaded
if (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:$true -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>
#А после удаляем с Mikrotik
if($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

Set-Executionpolicy unrestricted

#Check if out module loaded
if (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>
#А после удаляем с Mikrotik
if($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

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

На заметку: от 23.05.2023 в данной заметке есть продолжение или скорее можно назвать как начало этой с нюансами которые были опущены когда она писалась, мол заработала и ладно, см здесь "Преднастройка резервного копирования Mikrotikов через PowerShell"

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

От ekzorchik