Скрипт для сетевых устройств

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

Выбор ПО

Задача условно распадается на 2 подзадачи:

  • Выбор языка программирования для скрипта;
  • Выбор среды выполнения для скрипта.

Опять же много вариантов, но идеально подходит Posh-SSH — модуль поддержки протоколов SSH, SFTP, SCP для PowerShell (далее PS). Домашняя страничка проекта.

Там много и подробно рассказано об использовании.

Требования: PowerShell 3.0 и .NET 4.0.

Средой выполнения становится удобный и распространённый PS, он же язык программирования скрипта.

Поскольку потребуется ещё подгружать данные для работы скрипта, то нужен модуль для PS PSExel.

Требования PowerShell 5.

Подготовка компьютера

Модуль PSExel отказывается устанавливаться на старые версии PS, поэтому сначала необходимо скачать обновление с MS.

Проверим версию PS с помощью команды:

$host.version
Скрипт для сетевых устройств

Теперь нужно разрешить выполнение неподписанных скриптов в PS, которое по умолчанию запрещено:

Set-ExecutionPolicy Unrestricted

PS при этом необходимо запускать от Администратора.

Установка

Posh устанавливается 1 командой:

iex (New-Object Net.WebClient).DownloadString("https://gist.github.com/darkoperator/6152630/raw/c67de4f7cd780ba367cccbc2593f38d18ce6df89/instposhsshdev")
Get-Command *ssh*

После успешного выполнения будет выведен список новых командлетов:

Скрипт для сетевых устройств

Теперь устанавливаем PSExel, для установки нужно запустить PS от Администратора:

Install-Module PSExcel

Установка может занимать несколько минут и возможно предложит установить NuGet:

Скрипт для сетевых устройств

Скрипт

Простой скрипт

Для разогрева рассмотрим простой скрипт для 1 устройства, нужен будет только Posh-SSH. Самая наверное востребованная задача это перезагрузка по расписанию. Конечно же проще всего воспользоваться опциями at/in команды reload на самом устройстве:

Switch# reload ?
  LINE Reason for reload
  at Reload at a specific time/date
  cancel Cancel pending reload
  in Reload after a time interval

Но мы не ищем лёгких путей и отработаем скрипт на пошике:

Function Restart ( )
{
 Get-SSHSession | Remove-SSHSession

$PWord = ConvertTo-SecureString –String "пароль" –AsPlainText -Force
$Credential = New-Object –TypeName System.Management.Automation.PSCredential –ArgumentList "логин", $PWord

$SSHSession=New-SSHSession -ComputerName "IP адрес" -Credential $Credential -AcceptKey

$SSH = $SSHSession | New-SSHShellStream

Start-Sleep -Seconds 1
 $cmd1="reload"
 $SSH.WriteLine( $cmd1)
Start-Sleep -Seconds 1
 $cmd2=""
 $SSH.WriteLine( $cmd2)

Get-SSHSession | Remove-SSHSession
}

Restart

Далее ставим выполнение скрипта в Планировщик.

Если нет SSH

Столкнулся с такой ситуацией: коммутаторы CISCO прошиты и нужно их ребутнуть, но сделать это можно только через Telnet и только в короткий промежуток времени ночью, удалённого доступа из дома нет. Опять же: как сделать без опций команды reload? Поможет Telnet Scripting Tool, взять можно здесь.

Программа нормально работает и с новыми версиями Windows, включая 10 и 2012 R2. Нужно только обязательно выключить Контроль учётных записей, иначе скрипт повиснет в Планировщике не начав выполняться. Строка запуска:

tst10.exe /r:script.txt /o:out.txt

Содержимое script.txt для перезапуска будет следующим:

192.168.10.3
WAIT “Username:”
SEND “логин\m”
WAIT “Password:”
SEND “пароль\m”
WAIT “#”
SEND “reload\m”
WAIT “Proceed with reload? [confirm]”
SEND “\m”
Скрипт посложнее

Итак, скрипт использует цикл: в теле цикла в каждой итерации построчно выбираются данные из файла Exel, а затем вызывается функция, выполняющая необходимые команды на устройстве, до тех пора, все строки из файла не будут выбраны.

Подготовка файла Exel

Для примера использования Posh возьмем добавление пользователей на 5 коммутаторов CISCO. Каждый коммутатор может иметь отличные от других коммутаторов реквизиты доступа администратора (логин, пароль) и реквизиты доступа для нового пользователя также могут отличаться.

Сначала потребуется подготовить файл Exel с параметрами. Пример такого файла (SSH.xlsx):

IP_NetAdmPassAdmNewUserPassUser
192.168.1.1admin1pass1user1pass_user1
192.168.2.1admin2pass2user2pass_user2
192.168.3.1admin3pass3user3pass_user3
192.168.4.1admin4pass4user4pass_user4
192.168.5.1admin5pass5user5pass_user5
Подготовка функции скрипта

Функция включает в себя переменные из файла Exel и работает следующим образом:

  1. Удаляется существующая SSH сессия, если она есть;
  2. Происходит подключение к текущему устройству;
  3. Вход в режим глобальной конфигурации;
  4. Выполнение команды по созданию пользователя;
  5. Выход из режима глобальной конфигурации;
  6. Сохранение текущей конфигурации в стартовую;
  7. Удаление сессии SSH.

Поскольку выполнение команды занимает некоторое время, то по месту вводятся паузы в 1 секунду:

Start-Sleep -Seconds 1

Запись конфигурации занимает больше времени, тут нужна дополнительная пауза в 3 секунды.

Function CreateUser ( $IP_Net, $Adm, $PassAdm, $NewUser, $PassNewUser)
{
 Get-SSHSession | Remove-SSHSession

$PWord = ConvertTo-SecureString –String $PassAdm –AsPlainText -Force
$Credential = New-Object –TypeName System.Management.Automation.PSCredential –ArgumentList $Adm, $PWord

$SSHSession=New-SSHSession -ComputerName $IP_Net -Credential $Credential -AcceptKey

$SSH = $SSHSession | New-SSHShellStream

Start-Sleep -Seconds 1
 $cmd1="config t"
 $SSH.WriteLine( $cmd1)
 $SSH.read()
Start-Sleep -Seconds 1
 $cmd2="username "+$NewUser+" privilege 3 secret "+$PassNewUser
 $SSH.WriteLine( $cmd2)
 $SSH.read()
Start-Sleep -Seconds 1
 $cmd3="exit"
 $SSH.WriteLine( $cmd3)
Start-Sleep -Seconds 1
 $SSH.read()
 $cmd4="wr"
 $SSH.WriteLine( $cmd4)
Start-Sleep -Seconds 3
 $SSH.read()

Get-SSHSession | Remove-SSHSession
}
Подготовка цикла

Цикл работоспособен, если в файле Exel 2 и более строки.

$f1="D:\SSH.xlsx"
Test-Path $f1
$n=Import-XLSX $f1 -Sheet "Sh1" 
$l=$n.Length
for ($i=0; $i -lt $l; $i++)
 {
 $k1=$n[$i].IP_Net
 $k2=$n[$i].Adm
 $k3=$n[$i].PassAdm
 $k4=$n[$i].NewUser
 $k5=$n[$i].PassNewUser
 CreateUser $k1 $k2 $k3 $k4 $k5
 }
Проверка скрипта

Помещаем функцию и цикл (функция должна быть объявлена до цикла) в файл SSH.ps1. Выполнять и отлаживать работу скрипта лучше в среде PS ISE. Файл Exel на момент выполнения скрипта должен быть закрыт, иначе будет ошибка доступа к файлу.

Вывод скрипта следующий:

PS C:\WINDOWS\system32> D:\SSH.ps1
True - закрытие сессии

Router1#
config t
Enter configuration commands, one per line. End with CNTL/Z.
Router1(config)#
username user1 privilege 3 secret pass_user1
Router1(config)#
exit
Router1#
wr
Building configuration...
[OK]
3550-1#
True - закрытие сессии
...

Проверим конфигурацию Router1:

R1# sh run | include username
username admin1 ...
username user1 privilege 3 secret 5 $1$YYvv$ftLXxEbE0fQlpsQuqSqrE0

Пробуем подключиться под новым пользователем:

login as: user1
Using keyboard-interactive authentication.
Password: XXXXXXXXXX

R1# - подключение успешно

Заключение

Таким способом можно выполнять любые команды, а не только создавать пользователя, сразу на группе сетевых устройств. Недостатком является то, что нужно каждый раз подготавливать новый файл Exel вручную и это будет рутинной работой. Достоинством является ускорение процесса выполнения команд по сравнению с ручными манипуляциями. Гибкостью является возможность задавать различные параметры для разных устройств.

В общем и целом есть свои плюсы, есть свои минусы, но данный метод вполне жизнеспособен.

Добавить комментарий